如何使用函数(python,tkinter)创建可跟踪的小部件

时间:2019-08-30 10:20:52

标签: python tkinter

我目前正在尝试使用tkinter为非常特定的数据处理工具创建GUI。用户将通过按钮加载文件,并且根据该数据,该工具将显示许多下拉菜单,以选择特定于所提供数据的选项。 现在,我坚持在初始化mainloop之后创建那些小部件(事实之后,我需要初始化/更新它们,因为用户还应该能够加载多个文件)。小部件正在显示,尽管我无法访问它们的值,因为那是函数内部的局部变量。

TLDR:我想在初始化窗口后创建和更新tkinter小部件,并且需要访问其值

我尝试编写如下所示的函数,该函数将根据其他代码触发。可悲的是,它们提供的值仅在功能终止时反映小部件的值(在这种情况下为下拉列表),而不会随小部件而变化。 将它们更改为全局变量也不能解决更新问题。 事后,我研究了创建小部件的不同方法,但似乎没有找到方法。

import tkinter as tki

root = tki.Tk()
root.title('Data Comparison')

#specifying a frame and its grid
frame = tki.Frame(root)
frame.grid(column=9, row=7)

#I'm working with dicts, not lists, because that more accurately represents my
#actual data
numbers= {'one':1, 'two':2, 'three':3, 'four':4} 
colors= {'blue':5, 'red':6, 'green':7, 'orange':8, 'pink':9, 'yellow':10}

def createDropdown():
    global DDvalue
    DDvalue = tki.StringVar(root)
    DDvalue.set(list(numbers)[0]) 
    global DDvalues
    DDvalues = tki.OptionMenu(frame, DDvalue, *numbers)
    DDvalues.grid(column= 7, row = 1)
#the global variables only display the accurate value at the time of creation of the widget
createDropdown()

def displayvalue():
    print(str(DDvalue.get()))

DDvalue.trace_add('write', displayvalue())

def updateDropdown():
    DDvalues.destroy

btnupdate= tki.Button(frame, text='update', command= updateDropdown)
btnupdate.grid (column= 8, row= 7)

#I also could not delete the widget with the button above

root.mainloop()

现在,在创建小部件(一个)时,trace_add仅打印一次该值,此后,更改该值将导致以下错误消息: TypeError:“ NoneType”对象不可调用

此外,更新按钮无法访问小部件

我希望看到在满足某些条件后才能创建的小部件的值。

1 个答案:

答案 0 :(得分:1)

destroy()需要调用paren。

displayvalue作为函数对象传递,并且不应具有括号。

trace在被调用的变量之上传递两个参数:最后一个是mode,它对应于触发回调的动作(write,{{1} }或read)。

函数和变量的命名对于阅读和理解代码非常重要。

您应该首先声明并分配变量;在创建它们之前,在函数内部声明它们是全局的,这是非常不好的做法。

tkinter通常别名为unset,而不是tk

tki