Python Tkinter顶层不工作

Python Tkinter顶层不工作,python,python-3.x,tkinter,tkinter-entry,Python,Python 3.x,Tkinter,Tkinter Entry,我正在尝试构建一个tkinter程序,该程序将从主窗口的文本字段中获取搜索字符串,然后使用搜索字符串的结果创建一个子窗口。因为我是新来的tkinter,所以我现在只想创建子窗口,并将搜索字符串传递给该窗口。运行程序时,我收到错误信息: AttributeError: '_tkinter.tkapp' object has no attribute 'Toplevel' 关于线路: line 23, in search 即: results_window = self.parent.Tople

我正在尝试构建一个tkinter程序,该程序将从主窗口的文本字段中获取搜索字符串,然后使用搜索字符串的结果创建一个子窗口。因为我是新来的tkinter,所以我现在只想创建子窗口,并将搜索字符串传递给该窗口。运行程序时,我收到错误信息:

AttributeError: '_tkinter.tkapp' object has no attribute 'Toplevel'
关于线路:

line 23, in search
即:

results_window = self.parent.Toplevel(self)
代码如下:

import tkinter as tk

#App Constants
APP_TITLE = 'TKINTER_TEST'
APP_ICON = '\icon\path.ico'

#Geo Constants
MAIN_WIDTH = 600
MAIN_HEIGHT = 300
MAIN_X = '-0'
MAIN_Y = '+0'


class MainApp():
    def __init__(self, parent):
        self.parent = parent

    def get_search(self):
        pass

    def search(self, search_string):
        results_window = self.parent.Toplevel(self)


    def build_widgets(self):
        search_string = tk.StringVar()
        text = tk.Entry(root, textvariable = search_string).pack()
        search_cmd = tk.Button(root, text="Search", command=self.search(search_string.get())).pack()


#MAIN
root = tk.Tk()

#root.geometry('500x300-0+0')
root.geometry('{}x{}{}{}'.format(MAIN_WIDTH, MAIN_HEIGHT, MAIN_X, MAIN_Y))
root.title(APP_TITLE)

main = MainApp(root)
main.build_widgets()

root.mainloop()

我是不是走错了路?

Toplevel
是一个小部件,例如
Frame

所以第23行必须是:
self.result\u window=tk.Toplevel(self.parent)
Toplevel
是一个类似于框架的小部件

所以第23行必须是:
self.result\u window=tk.Toplevel(self.parent)

您可以做一些事情来改进代码的结构,但是为了回答眼前的问题,您可以创建一个
Toplevel
窗口,就像创建小部件一样,例如
results\u window=tk.Toplevel(root)
results\u window=tk.Toplevel(self.parent)
。顺便说一句,您的小部件可能应该使用
self.parent
而不是全局
root
。使用
root
,没有什么坏处,但是如果GUI对象使用自己的属性,而不是引用像
root
@PM2Ring这样的全局名称,那就更整洁了,非常感谢!这非常有效。我还修复了对root的引用,将它们更改为self.parent。那好多了。当您提到我可以做一些事情来改进代码的结构时,我可以问一下您的意思吗?我希望它尽可能的专业化,这样我现在就可以养成这样的习惯,这样在将来的项目中就很自然了。对不起,我现在正忙于自己的代码,这就是为什么我没有写一个正确的答案。但是你可以把
root=tk.tk()
和相关的代码放到
MainApp
\uuu init\uuuu
中。你可以做一些事情来改进代码的结构,但是为了回答你眼前的问题,你可以像创建小部件一样创建一个
Toplevel
窗口,例如
results\u window=tk.Toplevel(根)
结果\u窗口=tk.Toplevel(self.parent)
。顺便说一句,您的小部件可能应该使用
self.parent
而不是全局
root
。使用
root
没有什么坏处,但是如果GUI对象使用自己的属性而不是引用全局名称,比如
root
@PM2Ring,那就更整洁了,非常感谢!这非常有效。我还修复了它我对root的引用,将它们更改为self.parent。这样更好。当你提到我可以做一些事情来改进代码的结构时,我可以问你一个例子,你的意思是什么吗?我希望它尽可能专业,这样我现在就可以养成这样的习惯,以便在将来的专业版中变得自然jects.对不起,我现在正忙于自己的代码,这就是为什么我没有写一个正确的答案。但是你可以将
root=tk.tk()
和相关代码放入
MainApp
\uu init\uuuu
中。