Python 设置为在多个窗口中显示的Tkinter小部件将在同一窗口中显示

Python 设置为在多个窗口中显示的Tkinter小部件将在同一窗口中显示,python,tkinter,Python,Tkinter,因此,我的python程序中有几个不同的小部件:infobar和texteditor在我的App类中命令行和输出。但当我运行程序时,命令行和输出会出现在我的应用程序窗口中 class Terminal(Frame): ### A window used for running Terminal commands. def __init__(self, master): ### Initialize the Terminal app. # Initialize frame

因此,我的python程序中有几个不同的小部件:
infobar
texteditor
在我的
App
类中<在我的
终端
类中,code>命令行和
输出
。但当我运行程序时,命令行和输出会出现在我的应用程序窗口中

class Terminal(Frame):
### A window used for running Terminal commands.

def __init__(self, master):
    ### Initialize the Terminal app.
    # Initialize frame
    frame = Frame(terminalroot)
    frame.pack()

    # Create fonts
    txtFont = tkFont.Font(family="Monaco",size=10)

    # Initilize Commandline.
    self.commandline = Text(wrap=None,font=txtFont,width=40,height=1)
    self.commandline.pack()

    # Initialize Output.
    self.output = Text(wrap=WORD,font=txtFont,width=40,height=30)
    self.output.pack()

class App(Frame):
### The main application window.
    def __init__(self, master):
    ### Initialize the program.
    ## Initialize the frame
    ##  Setup the frame.
    ##  Set the title of the window.
    ##  Pack the frame.
    ## Initialize random class variables.
    ## Create fonts.
    ##  txtFont: Monaco, size 10. Used for most of the text areas.
    ## Create and pack the editor.
    ##  Wrap text along words.
    ##  Set size to W120 and H20.
    ##  Insert a short message to the text editor.
    ##  Reset any undo/redos.
    ##  Pack the editor.
    ## Setup tags.
    ##  Alert, sel.
    ## Create and pack the info bar.
    ##  Set size to W120 and H1.
    ##  Insert Info bar to the info bar.
    ## Setup the menu bar.
    ##  File:
    ##   Save, ^S, save_it
    ##   Save as, ^[shift]S, save_it_as
    ##   Load, ^L, load_it_and_clear
    ##   Import, ^I, load_it
    ##  Edit:
    ##   Undo, ^Z, undo
    ##   Redo, ^Y, redo
    ##  Style:
    ##   Default, no shortcut, set_theme_default
    ##   White on Black, no shortcut, set_theme_wob
    ##   Homebrew, no shortcut, set_theme_hbrew
    ## Setup the popup menu.
    ##  Undo, ^Z, undo
    ##  Redo, ^Y, redo
    ## Bind various commands.
    ## Final configuration.
    self.frame = Frame(root, background="black")
    root.title("BasicEdit")
    self.frame.pack()

    self.filename = "Hello World.txt"

    txtFont = tkFont.Font(family="Monaco", size=10)

    self.texteditor = Text(wrap=WORD,font=txtFont,width=120,height=20)
    self.texteditor.insert(END, """Lorem epsum...""")
    self.texteditor.edit_reset()
    self.texteditor.pack()

    self.texteditor.tag_config("alert", foreground="white", background="black")
    self.texteditor.tag_config("sel", foreground="blue")

    self.infobar = Text(font=txtFont,height=1,width=120)
    self.infobar.insert(END, "Info bar")
    self.infobar.pack()

    self.menubar = Menu()
    self.filemenu = Menu(self.menubar, tearoff=0)
    self.filemenu.add_command(label="Save", command=self.save_it, accelerator="Ctrl+S")
    self.filemenu.add_command(label="Save as", command=self.save_it_as, accelerator="Ctrl+Shift+S")
    self.filemenu.add_command(label="Load", command=self.load_it_and_clear, accelerator="Ctrl+L")
    self.filemenu.add_command(label="Import", command=self.load_it, accelerator="Ctrl+I")
    self.editmenu = Menu(self.menubar, tearoff=0)
    self.editmenu.add_command(label="Undo", command=self.undo, accelerator="Ctrl+Z")
    self.editmenu.add_command(label="Redo", command=self.redo, accelerator="Ctrl+Y")
    self.stylemenu = Menu(self.menubar, tearoff=0)
    self.stylemenu.add_command(label="Default", command=self.set_theme_default)
    self.stylemenu.add_command(label="White on Black", command=self.set_theme_wob)
    self.stylemenu.add_command(label="Homebrew", command=self.set_theme_hbrew)
    self.menubar.add_cascade(label="File", menu=self.filemenu)
    self.menubar.add_cascade(label="Edit", menu=self.editmenu)
    self.menubar.add_cascade(label="Style", menu=self.stylemenu)

    self.popup = Menu(tearoff=1)
    self.popup.add_command(label="Undo", command=self.undo, accelerator="Ctrl+Z")
    self.popup.add_command(label="Redo", command=self.redo, accelerator="Ctrl+Y")
    root.bind("<Button-2>", self.rightmenu)

    root.bind("<Control-q>", self.quit)
    root.bind("<Control-Q>", self.quit)
    root.bind("<Control-s>", self.save_it)
    root.bind("<Control-S>", self.save_it)
    root.bind("<Control-l>", self.load_it_and_clear)
    root.bind("<Control-L>", self.load_it_and_clear)
    root.bind("<Control-i>", self.load_it)
    root.bind("<Control-I>", self.load_it)
    root.bind("<Control-z>", self.undo)
    root.bind("<Control-Z>", self.undo)
    root.bind("<Control-y>", self.redo)
    root.bind("<Control-Y>", self.redo)
    root.bind("<Key>", self.keyPress)

    self.set_theme_default()
    root.config(menu=self.menubar)
类终端(帧):
###用于运行终端命令的窗口。
定义初始(自我,主):
###初始化终端应用程序。
#初始化帧
帧=帧(终端根)
frame.pack()
#创建字体
txtFont=tkFont.Font(family=“Monaco”,size=10)
#初始化命令行。
self.commandline=Text(wrap=None,font=txtFont,width=40,height=1)
self.commandline.pack()
#初始化输出。
self.output=Text(wrap=WORD,font=txtFont,width=40,height=30)
self.output.pack()
类应用程序(框架):
###主应用程序窗口。
定义初始(自我,主):
###初始化程序。
##初始化帧
##设置框架。
##设置窗口的标题。
##把架子打包。
##初始化随机类变量。
##创建字体。
##txtFont:摩纳哥,10号。用于大多数文本区域。
##创建并打包编辑器。
##用单词包装文本。
##将大小设置为W120和H20。
##在文本编辑器中插入短消息。
##重置任何撤消/重做。
##打包编辑器。
##设置标签。
##警惕,赛尔。
##创建并打包信息栏。
##将大小设置为W120和H1。
##将信息栏插入信息栏。
##设置菜单栏。
##文件:
##保存,^S,保存它
##另存为,^[shift]S,另存为
##加载,^L,加载并清除
##导入,^I,加载它
##编辑:
##撤消,^Z,撤消
##重做,^Y,重做
##风格:
##默认,无快捷方式,设置\u主题\u默认
##黑白相间,没有捷径,设定主题
##自制,无捷径,设置主题
##设置弹出菜单。
##撤消,^Z,撤消
##重做,^Y,重做
##绑定各种命令。
##最终配置。
self.frame=frame(根,背景=“黑色”)
根标题(“基本名称”)
self.frame.pack()
self.filename=“Hello World.txt”
txtFont=tkFont.Font(family=“Monaco”,size=10)
self.texteditor=Text(wrap=WORD,font=txtFont,width=120,height=20)
self.texteditor.insert(结束,““Lorem epsum…”)
self.texteditor.edit_reset()
self.texteditor.pack()
self.texteditor.tag_config(“警报”,前台=“白色”,后台=“黑色”)
self.texteditor.tag_config(“sel”,前台=“蓝色”)
self.infobar=Text(font=txtFont,高度=1,宽度=120)
self.infobar.insert(结束,“信息栏”)
self.infobar.pack()
self.menubar=菜单()
self.filemenu=Menu(self.menubar,tearoff=0)
self.filemenu.add_命令(label=“Save”,command=self.Save_it,accelerator=“Ctrl+S”)
self.filemenu.add_命令(label=“Save as”,command=self.Save_it_as,accelerator=“Ctrl+Shift+S”)
self.filemenu.add_命令(label=“Load”,command=self.Load_it_和_clear,accelerator=“Ctrl+L”)
self.filemenu.add_命令(label=“Import”,command=self.load_it,accelerator=“Ctrl+I”)
self.editmenu=菜单(self.menubar,tearof=0)
self.editmenu.add_命令(label=“Undo”,command=self.Undo,accelerator=“Ctrl+Z”)
self.editmenu.add_命令(label=“Redo”,command=self.Redo,accelerator=“Ctrl+Y”)
self.stylemenu=Menu(self.menubar,tearof=0)
self.stylemenu.add\u命令(label=“Default”,command=self.set\u主题\u默认)
self.stylemenu.add_命令(label=“黑底白”,command=self.set_主题_-wob)
self.stylemenu.add_命令(label=“Homebrew”,command=self.set_theme\u hbrew)
self.menubar.add\u级联(label=“File”,menu=self.filemenu)
self.menubar.add\u级联(label=“Edit”,menu=self.editmenu)
self.menubar.add\u级联(label=“Style”,menu=self.stylemenu)
self.popup=菜单(tearoff=1)
self.popup.add_命令(label=“Undo”,command=self.Undo,accelerator=“Ctrl+Z”)
self.popup.add_命令(label=“Redo”,command=self.Redo,accelerator=“Ctrl+Y”)
root.bind(“,self.rightmenu)
root.bind(“,self.quit)
root.bind(“,self.quit)
root.bind(“,self.save\u它)
root.bind(“,self.save\u它)
root.bind(“,self.load\u it\u和\u clear)
root.bind(“,self.load\u it\u和\u clear)
root.bind(“,self.load\u it)
root.bind(“,self.load\u it)
root.bind(“,self.undo)
root.bind(“,self.undo)
root.bind(“,self.redo)
root.bind(“,self.redo)
root.bind(“,self.keyPress)
self.set_theme_default()
root.config(menu=self.menubar)
请注意,除了在正确的窗口中定位我的小部件之外,所有代码都可以工作。

如果您不告诉小部件其父窗口是什么,则默认为根窗口。在许多小部件中,您没有设置父窗口。您应该始终定义父窗口

在继承自
Frame
Toplevel
的类中定义小部件时尤其如此。当你这样做的时候,假设这个类是自包含的——所有的东西都是这个类的子类。当一些小部件成为根窗口的子部件时,您的代码将变得难以理解,因为您无法对哪些小部件属于哪些父部件做出任何假设

请注意,您的terminal类是
Frame
的子类,但您将命令行和输出窗口放在根窗口中(由于不将其放在其他任何地方):

同样地:

class App(Frame):
    def __init__(self, master):
        ...
        self.texteditor = Text(wrap=WORD,font=txtFont,width=120,height=20)
上述每个文本小部件都应该使用
self
作为
text
小部件的父级,以便子小部件出现在
框架
小部件中。例如:

self.texteditor = text(self, wrap=WORD, ...)

我认为您没有设置变量所属的窗口。将变量定义为小部件时,您可以控制它所属的父窗口,即更改为<
self.texteditor = text(self, wrap=WORD, ...)