Skip to main content
 首页 » 编程设计

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

2025年05月04日15lautakyan007

我正在尝试创建一个 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

相同

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