PYTHON:Tkinter.OptionMenu 问题:option menu不执行command函数给用户选择

标签 python tkinter

我正在尝试创建一个 python 程序,如下所示。 它主要是读取包含公交时刻表的文件,并在 Tkinter 中显示出发列表和到达公交车站以及相应的时间。

我在这里使用以下代码,以便它会更新每个出发或到达站点的时间。但是当我选择停靠点时,它不会调用函数。 我不明白为什么。

Tkinter.OptionMenu(self.root,self.Departure,*self.BusStops,command=self.update_departure()).pack()
Tkinter.OptionMenu(self.root,self.Arrival,*self.BusStops,command=self.update_arrival()).pac

有人可以解释一下吗?

如果不使用类结构,同样有效。

我在 windows xp 2002 service pack 2 和 python 2.6 版本上运行 导入 Tkinter 导入时间

class App():
    def __init__(self):
    self.root  = Tkinter.Tk()
    self.DEBUG_ENABLE = 1

    self.timetable_file_name = "200_timetable.txt"
    self.BusStops    = list()
    self.ArrivalTime = list()
    self.update_timetable()

    self.Departure   = Tkinter.StringVar()
    self.Arrival     = Tkinter.StringVar()
    self.StartTime   = Tkinter.StringVar()
    self.EndTime     = Tkinter.StringVar()

    self.label = Tkinter.Label(text="")
    self.label.pack()
    self.update_clock()

    self.Departure.set(self.BusStops[0])
    self.Arrival.set(self.BusStops[-1])
    self.StartTime.set("hi")
    self.EndTime.set("ih")

    self.OptMenuDep= Tkinter.OptionMenu(self.root,self.Departure,*self.BusStops,command=self.update_departure()).pack()
    self.OptMenuArr= Tkinter.OptionMenu(self.root,self.Arrival,*self.BusStops,command=self.update_arrival()).pack()
    self.OptMenuDepTime = Tkinter.OptionMenu(self.root,self.StartTime,"").pack()
    self.OptMenuArrTime = Tkinter.OptionMenu(self.root,self.EndTime,"").pack()

    self.root.mainloop()

    def debug(self,message):
    if self.DEBUG_ENABLE:
       print "DEBUG MESSAGE : ", message

    def update_clock(self):
    now = time.strftime("%H:%M:%S")
    self.label.configure(text=now)
    self.root.after(200, self.update_clock)

    def update_timetable(self):
    self.file_desc = open(self.timetable_file_name)
    for line in self.file_desc.readlines():
        self.BusStops.append(line.split('\t')[0])
        self.ArrivalTime.append(line.split('\t')[2:-1])
    self.file_desc.close()

    def update_departure(self):
    self.debug("entering update departure")
    stop_name = self.Departure.get()
    count = 0
    for stop in self.BusStops:
        if (stop == stop_name):
           break
        else:
           count += 1
    self.StartTime.set(self.ArrivalTime[count])
    count = 0

    def update_arrival(self):
    self.debug("entering update arrival")
    stop_name = self.Arrival.get()
    count = 0
    for stop in self.BusStops:
        if (stop == stop_name):
           break
        else:
           count += 1
    self.EndTime.set(self.ArrivalTime[count])
    count = 0

# The Main Program Starts Here

app=App()

"""""""""""""""""""""""""" 文件200_timetable.txt的数据格式如下

NICE - J.C. Bermond 站 07:30 07:45 08:00 08:10 08:15 08:30

NICE - J. Médecin/Hôtel des Postes 07:32 07:47 08:02 08:12 08:17 08:32

尼斯 - 格里马尔迪 07:33 07:48 08:03 08:13 08:18 08:33

尼斯 - 里沃利 07:34 07:49 08:04 08:14 08:19 08:34

""""""""""""""""""""""""""""""

最佳答案

当您编写 command=self.update_departure() 时,您是在说“执行命令 self._update_departure,并将该调用的结果用作命令的名称”。由于 self._update_departure() 返回 None,这与执行 command=None

相同

换句话说,省略 () -- 您需要传递对函数的引用。

关于PYTHON:Tkinter.OptionMenu 问题:option menu不执行command函数给用户选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4947592/

相关文章:

python - Django - Migrate 命令表示执行第二次 makemigrations 后该表存在

python - 按升序生成 Kmeans 的质心

python - 注册所有子类

python - 无法使用 Python 工具在 Visual Studio 中启动 Tkinter 窗口

python - 本地机器 _tkinter.TclError : couldn't connect to display ":0"

python - 多个 CSV Python 排序

python - 创建Docker镜像后; docker 运行给出ModuleNotFoundError

python - Tkinter 列表框的 "selection_set"和 "activate"暂时禁用扩展选择

scripting - 黑莓开发脚本语言?

python - 为什么我的按钮的命令在我创建按钮时立即执行,而不是在我单击它时执行?