【问题标题】:Why does my variable not flip accordingly?为什么我的变量没有相应地翻转?
【发布时间】:2017-01-30 06:05:53
【问题描述】:

名为 'ft' 的按钮应该采用一个值的当前布尔状态,如果它是 True 'on' 则使其为 False 'off' 并删除一条红线,或者如果它是 False 'off' 则使其为 True ' on' 并重新创建红线。出于某种原因,这只适用于我按下按钮的前两次,然后它停止工作,我不知道为什么

   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()

【问题讨论】:

  • 您有两个变量redline,一个(本地)在controller 内,第二个(全局)在这个函数之外。再次创建此行时,您不会为外部/全局值分配新值。

标签: python tkinter logic


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多