【问题标题】:Python GUI callback functionsPython GUI 回调函数
【发布时间】:2018-08-11 20:08:13
【问题描述】:

我正在编写一个使用 GUI 计算每加仑英里数 (MPG) 的 Python 程序。 下面的代码包含一个名为 calc_mpg 的函数,该函数旨在使用来自主函数 'miles_entry' Entry 和 'gallons_entry' Entry 的输入来计算单击“calc_button”时车辆的每加仑英里数。

单击按钮时,我收到一条错误消息,提示未定义“miles_entry”。有没有一种方法必须重组或重新设计此代码才能按预期运行。

import tkinter
import tkinter.messagebox

def main():
     main_window = tkinter.Tk()
     upper_frame = tkinter.Frame(main_window)
     lower_frame = tkinter.Frame(main_window)

     label1 = tkinter.Label(upper_frame, text='This program calculates MPG')

     miles_prompt = tkinter.Label(upper_frame, text='How many miles can be 
     driven with full gastank?')
     miles_entry = tkinter.Entry(upper_frame, width = 10)
     gallons_prompt = tkinter.Label(upper_frame, text='How many gallons of 
     gas can the tank hold?')
     gallons_entry = tkinter.Entry(upper_frame, width = 10)

     miles_prompt.pack()
     miles_entry.pack()
     gallons_prompt.pack()
     gallons_entry.pack()

     calc_button = tkinter.Button(lower_frame, text='Calculate MPG', 
     command=calc_mpg)
     quit_button = tkinter.Button(lower_frame, text='Quit', 
     command=main_window.destroy)



    upper_frame.pack()
    lower_frame.pack()
    calc_button.pack()
    quit_button.pack()
    tkinter.mainloop()


def calc_mpg():
    miles = float(miles_entry.get())
    gallons = float(gallons_entry.get())

    mpg = miles / gallons

    tkinter.messagebox.showinfo('The miles per gallon for this vehicle is:' 
   + mpg + 'mpg.') 



main()

【问题讨论】:

    标签: python function user-interface tkinter


    【解决方案1】:

    您对为什么tk 应用程序通常封装在一个类中的原因一针见血。通过使用类,您可以持久保存对象并跨方法使用它们:

    import tkinter
    import tkinter.messagebox
    
    class main:
        def __init__(self):
            main_window = tkinter.Tk()
            upper_frame = tkinter.Frame(main_window)
            lower_frame = tkinter.Frame(main_window)
    
            label1 = tkinter.Label(upper_frame, text='This program calculates MPG')
    
            miles_prompt = tkinter.Label(upper_frame, text='How many miles can be driven with full gastank?')
            self.miles_entry = tkinter.Entry(upper_frame, width = 10)
            gallons_prompt = tkinter.Label(upper_frame, text='How many gallons of gas can the tank hold?')
            self.gallons_entry = tkinter.Entry(upper_frame, width = 10)
    
            miles_prompt.pack()
            self.miles_entry.pack()
            gallons_prompt.pack()
            self.gallons_entry.pack()
    
            calc_button = tkinter.Button(lower_frame, text='Calculate MPG', 
            command=self.calc_mpg)
            quit_button = tkinter.Button(lower_frame, text='Quit', 
            command=main_window.destroy)
    
            upper_frame.pack()
            lower_frame.pack()
            calc_button.pack()
            quit_button.pack()
            tkinter.mainloop()
    
        def calc_mpg(self):
            miles = float(self.miles_entry.get())
            gallons = float(self.gallons_entry.get())
    
            mpg = miles / gallons
    
            tkinter.messagebox.showinfo(title="Some info!",message='The miles per gallon for this vehicle is:' 
           + str(mpg) + 'mpg.') 
    
    main()
    

    我添加了self 来引用这两个条目,因此您可以在其他方法中使用它们(默认情况下,变量只存在于它们定义的函数中)。另请注意:

    1. 您忘记将mpg 转换回信息框中的字符串
    2. 信息框的第一个参数是标题,而不是内容

    如果对self 表示法或类不熟悉,您应该在创建tk 应用程序之前了解这一点。

    【讨论】:

      【解决方案2】:

      main() 作用域中的miles_entry 和gallon_entry,它们在calc_mpg() 中是不可见的。 @kabanus 是对的。 另一个解决方法是使用 functools 模块中的 partial()。可以将参数传递给回调:

      from functools import partial
      ...
      calc_button = tkinter.Button(lower_frame, text='Calculate MPG', command=partial(calc_mpg,miles_entry,gallons_entry) )
      ...
      def calc_mpg(miles_entry,gallons_entry):
        ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        相关资源
        最近更新 更多