2017-01-30 44 views
0

名爲'ft'的按鈕應該採用當前值的布爾狀態,如果它爲True'on'使其False'off'並刪除一條紅線,或者如果False'off'使其成爲'True' '並重新創建紅線。出於某種原因,這僅適用前兩次我按下按鈕,然後它停止工作,我想不通爲什麼爲什麼我的變量不會相應地翻轉?

import tkinter 
import tkinter.messagebox 
from tkinter import * 
state="on" 
def nothing(): 
    print ("meh.") 
def controller(canvas,redline,test): 
    def something(canvas, redline, state): 
     if state=="off": 
      state="on" 
      redline=canvas.create_line(0,100,200,50, fill="red") 
      print ("state=off", state) 
      return state 
     else: 
      state="off" 
      canvas.delete(redline) 
      print ("state=on",state) 
      return state 
    state=something(canvas, redline, test) 
    global state 
root=Tk() 

canvas = Canvas(root, width=200, height=100) 
blackline=canvas.create_line(0,0,200,50) 
redline=canvas.create_line(0,100,200,50, fill="red") 
greenline=canvas.create_line(0,50,200,50, fill="green") 

toolbar=Frame(root, bg="red") 
ft=Button(toolbar, text="TEST", command=lambda:controller(canvas,redline,state)) 
ft.pack(side=LEFT, padx=2, pady=2) 
toolbar.pack(side=TOP, fill=X) 

canvas.pack() 

root.mainloop() 
+0

你有兩個變量'redline',一個(地方)裏面'controller',和第二(全球)這個函數之外。再次創建此行時,您不會爲外部/全局值分配新值。 – furas

回答

1

你有兩個變量redline,一個(地方)內控制器,和第二(全球)在這個功能之外。再次創建此行時,您不會爲外部/全局值分配新值。你必須使用global redline內部功能

import tkinter as tk 
import tkinter.messagebox 

# --- functions --- 

def nothing(): 
    print ("meh.") 

def controller(): 
    global state 
    global redline 

    if state: 
     canvas.delete(redline) 
    else: 
     redline = canvas.create_line(0, 100, 200, 50, fill="red") 

    state = not state 
    print("state:", state) 

# --- main --- 

state = True 

root = tk.Tk() 

canvas = tk.Canvas(root, width=200, height=100) 
blackline = canvas.create_line(0, 0, 200, 50) 
redline = canvas.create_line(0, 100, 200, 50, fill="red") 
greenline = canvas.create_line(0, 50, 200, 50, fill="green") 

toolbar = tk.Frame(root, bg="red") 

ft = tk.Button(toolbar, text="TEST", command=controller) 

ft.pack(side='left', padx=2, pady=2) 
toolbar.pack(side='top', fill='x') 

canvas.pack() 

root.mainloop()