0

我想出了以下代码作为参考,以帮助我记住如何使用 TkInter 构建 GUI 应用程序。它运行良好,除非单击 Button1 或命令选项设置为 self.hello 的任何其他小部件。正如您在下面的代码中看到的,hello 函数就像一个占位符。虽然通过 IDLE 运行脚本时单击按钮可以正常工作,但如果您通过双击实际文件 test.pyw 启动程序,它只会导致应用程序退出。我的问题是,为什么?

#Some guy somewhere

from tkinter import *

class Application:

    def hello(self):
        msg = messagebox.showinfo('Message Title','Message Body')

    def __init__(self, parent):
        parent.resizable(0,0)
        parent.minsize(800, 400)
        parent.title('Top Level')

        # Global Padding pady and padx
        pad_x = 0
        pad_y = 0


        # CASCADE MENU
        # create a parent menu.
        self.parentmenu1 = Menu(parent, tearoff=0)
        #self.menubar1.add_command(label='Menu1', command=self.hello)

        #create a child menu for parent menu.
        self.parentmenu1_child1 = Menu(parent, tearoff=0)
        self.parentmenu1_child1.add_command(label='Item1', command=self.hello)
        self.parentmenu1_child1.add_command(label='Item2', command=self.hello)
        self.parentmenu1_child1.add_command(label='Item3', command=self.hello)

        #add child menu to parent menu.
        self.parentmenu1.add_cascade(label='Menu1', menu=self.parentmenu1_child1)

        #self.menubar1.add_separator()

        # SINGLE MENU
        # create a parent menu.
        self.parentmenu1.add_command(label='Menu2', command=self.hello)

        # SINGLE MENU
        # create a parent menu.
        self.parentmenu1.add_command(label='Menu3', command=self.hello)

        # display the parent menu.
        parent.config(menu=self.parentmenu1)

        # Create controls

        #create label
        self.label1 = Label(parent, text='Label1')
        #create textbox
        self.textbox1 = Entry(parent)
        #create button
        self.button1 = Button(parent, text='Button1', command=self.hello)

        #string variable to hold checkbox1 values.
        self.str_checkbox1 = StringVar()        
        #create checkbox
        self.checkbox1 = Checkbutton(parent, text='Checkbox1', variable=self.str_checkbox1, onvalue='on1', offvalue='off1')
        #deselect checkbox1
        self.checkbox1.deselect()
        #string variable to hold checkbox2 values.
        self.str_checkbox2 = StringVar()    
        #create checkbox
        self.checkbox2 = Checkbutton(parent, text='Checkbox2', variable=self.str_checkbox2, onvalue='on2', offvalue='off2')
        #deselect checkbox2
        self.checkbox2.deselect()

        #???? ..what sets the groupbox apart from others. primary key???!!
        self.str_radiobutton1 = StringVar()
        #command= parameter missing.
        self.radiobutton1 = Radiobutton(parent, text='Radio 1', variable=self.str_radiobutton1, value='a')
        self.radiobutton2 = Radiobutton(parent, text='Radio 2', variable=self.str_radiobutton1, value='b')
        self.radiobutton1.select()

        #create a list of options.
        optionList = ('Option1', 'Option2', 'Option3')
        #string variable to hold optionlist values.
        self.str_optionmenu1 = StringVar()
        #associate string variable with optionlist
        self.str_optionmenu1.set(optionList[0])
        #create optionmenu
        self.optionmenu1 = OptionMenu(parent, self.str_optionmenu1, *optionList)

        #create a frame
        self.frame1 = Frame(parent)
        #create a text.
        self.textarea1 = Text(self.frame1, width=20, height=10)
        #align text left and fill frame with it.
        self.textarea1.pack(side=LEFT, fill=Y)
        #create a scrollbar.
        self.scrollbar1 = Scrollbar(self.frame1)
        #align scrollbar right and fill frame with it.
        self.scrollbar1.pack(side=RIGHT, fill=Y)
        #what is going to be scrolled?
        self.scrollbar1.config(command=self.textarea1.yview)
        #set textarea scrollbar.
        self.textarea1.config(yscrollcommand=self.scrollbar1.set)
        #align frame left and fill.
        self.frame1.pack(side=LEFT, fill=Y)

        #create a frame
        self.frame2 = Frame(parent)
        #create a text.
        self.listbox1 = Listbox(self.frame2, width=20, height=10, activestyle='none', selectmode=SINGLE)
        #create a list of items.
        optionList = ('Item1', 'Item2', 'Item3', 'Item4', 'Item5', 'Item6', 'Item7', 'Item8', 'Item9', 'Item10', 'Item11')
        #add items from list to listbox
        for item in optionList:
            self.listbox1.insert(END, item)
        #align text left and fill frame with it.
        self.listbox1.pack(side=LEFT, fill=Y)
        #create a scrollbar.
        self.scrollbar2 = Scrollbar(self.frame2)
        #align scrollbar right and fill frame with it.
        self.scrollbar2.pack(side=RIGHT, fill=Y)
        #what is going to be scrolled?
        self.scrollbar2.config(command=self.listbox1.yview)
        #set textarea scrollbar.
        self.listbox1.config(yscrollcommand=self.scrollbar2.set)
        #align frame left and fill.
        self.frame2.pack(side=LEFT, fill=Y)


        # Place controls inside of grid
        self.label1.grid(row=0, column=0, padx=pad_x, pady=pad_y, sticky=W)
        self.textbox1.grid(row=0, column=1, padx=pad_x, pady=pad_y, sticky=W)
        self.button1.grid(row=1, column=0, padx=pad_x, pady=pad_y, sticky=W)
        self.checkbox1.grid(row=1, column=1, padx=pad_x, pady=pad_y, sticky=W)
        self.checkbox2.grid(row=1, column=2, padx=pad_x, pady=pad_y, sticky=W)
        self.optionmenu1.grid(row=2, column=0, padx=pad_x, pady=pad_y, sticky=W)
        self.frame1.grid(row=2, column=1, padx=pad_x, pady=pad_y, sticky=W)        
        self.radiobutton1.grid(row=3, column=0, padx=pad_x, pady=pad_y, sticky=W)
        self.radiobutton2.grid(row=3, column=1, padx=pad_x, pady=pad_y, sticky=W)
        self.frame2.grid(row=4, column=0, padx=pad_x, pady=pad_y, sticky=W)

if __name__ == '__main__':
    parent = Tk()
    app = Application(parent)
    parent.mainloop()
4

1 回答 1

0

好吧。显然 tkMessageBox 在 Python 3.x 中已重命名为 messagebox。此模块在 tkinter 中也不可用,因此即使开发人员可能会使用:

from tkinter import *

..他/她仍然需要:

from tkinter import messagebox
于 2013-03-25T17:18:27.133 回答