【问题标题】:Using OOP to make Tkinter GUI使用 OOP 制作 Tkinter GUI
【发布时间】:2021-11-23 22:10:44
【问题描述】:

我是编程新手,所以我做了一个简单的在线项目并尝试使用 OOP 为它制作 GUI,你能帮我解决这个错误吗:

'RuntimeError: Too early to run the main loop: no default root window'

我把按钮拿出来让它更短:

from tkinter import *
import tkinter as tk
from tkinter import ttk

contact_list = [
    ['Dermot Bruce', '071 0403 6313'],
    ['Felix Kent', '071 7050 4862'],
    ['Eren Yeager', '071 4174 1560'],
    ['Roy Mustang'  '071 5173 4259'],
    ['Arietta Curtis', '071 4415 8004'],
    ['Jennifer Love', '071 8857 1196'],
]


class address_list():
    def __init__(self, *args):
        self.contact = contact_list


class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self, address_list)
        self.title = "Address Book Interface"
        self.geometry('400x400')
        self.resizable(0, 0)
        self.config(bg='lightblue')

        self.name = StringVar()
        self.number = StringVar()
        # create frame
        self.frame = Frame(self)
        self.frame.pack(side=RIGHT)

        def add_contact(contact_list):
            contact_list.append([self.name.get(), self.number.get()])
            select_set()

        # to view selected contact(first select then click on view button

        def edit(contact_list):
            contact_list[Selected()] = [self.name.get(), self.number.get()]
            select_set()

        def view(contact_list):
            NAME, PHONE = contact_list[Selected()]
            self.name.set(NAME)
            self.number.set(PHONE)

        # to delete selected contact

        def delete(contact_list):
            del contact_list[Selected()]
            select_set()

        # empty name and number field

        def reset(contact_list):
            self.name.set('')
            self.number.set('')

        # exit game window

        def exit(contact_list):
            self.destroy()

        def select_set(contact_list):
            contact_list.sort()
            select.delete(0, END)
            for name, phone in contact_list:
                enter
                code
                hereselect.insert(END, self.name)

        select_set()


if __name__ == '__main__':
    mainloop()

【问题讨论】:

  • 要初始化 tkinter,您必须添加一个根(默认)窗口。您可以使用root=Tk() 添加它
  • @NishaniKasineshan 不,它们是从 Tk 继承的,所以只需在实例上使用 .mainloop()
  • 甚至在课堂上?我认为这被处理为 tk.Tk__init__(self) 会修复运行时错误吗?
  • 而不是mainloop() 使用App().mainloop(),当然你需要先调用这个类,它不会仅仅被定义做任何事情
  • 导入时不要使用*

标签: python oop tkinter


【解决方案1】:

这个错误就是它所说的。在创建根窗口之前,您不能调用mainloop,并且您永远不会创建任何小部件。

您的代码应如下所示:

if __name__ == '__main__':
    app = App()
    app.mainloop()

【讨论】:

  • 这行也有问题:tk.Tk.__init__(self, address_list),关于create() 参数,因为address_list 是一个类型
  • @Matiiss,是的,但这与此错误无关。
  • 我目前有很多错误,其中; app = App() & tk.Tk.__init__(self, address_list)
猜你喜欢
  • 2021-03-27
  • 2016-03-18
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2016-09-18
  • 2023-04-01
相关资源
最近更新 更多