Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未显示自定义GUI元素的类_Python_Oop_Tkinter_Tk - Fatal编程技术网

Python 未显示自定义GUI元素的类

Python 未显示自定义GUI元素的类,python,oop,tkinter,tk,Python,Oop,Tkinter,Tk,我正在尝试创建一个GUI,如下图所示: 代码如下: #! /usr/bin/python3 import tkinter as tk # CLASS FOR OWN PANEL: class Mypanel(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.label = tk.Label(self, text="Enter here:") self.entry = tk.En

我正在尝试创建一个GUI,如下图所示:

代码如下:

#! /usr/bin/python3

import tkinter as tk

# CLASS FOR OWN PANEL: 
class Mypanel(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.label = tk.Label(self, text="Enter here:")
        self.entry = tk.Entry(self)
        self.label.pack()
        self.entry.pack()

# FN FOR BUTTON:
def adder():
    main_label.set((panel1.entry.get() + panel2.entry.get()))

# CREATE GUI ELEMENTS: 
main_window = tk.Tk()       # CREATE MAIN WINDOW
panel1 = Mypanel()          # CREATE A PANEL
panel2 = Mypanel()          # CREATE ANOTHER PANEL
main_label = tk.Label(main_window, text="Press button to get values.")  
main_button = tk.Button(main_window, text="Get values.", command=adder) 

# PACK ALL GUI ELEMENTS IN main WINDOW
panel1.pack()
panel2.pack()
main_label.pack()
main_button.pack()

# SHOW MAIN WINDOW: 
main_window.mainloop()
但是,它给出了以下错误:

$ ./guipanels.py
Traceback (most recent call last):
  File "./guipanels.py", line 29, in <module>
    panel1.pack()
  File "/usr/lib/python3.5/tkinter/__init__.py", line 1961, in __getattr__
    return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'pack'
问题在哪里?如何解决?感谢您的帮助。

您需要的不是Tk类而是框架:

import tkinter as tk

# CLASS FOR OWN PANEL:
class Mypanel(tk.Frame):
    def __init__(self, master=None, **kwargs):
        super().__init__(master, kwargs)
        self.label = tk.Label(self, text="Enter here:")
        self.entry = tk.Entry(self)

        self.label.pack()
        self.entry.pack()
        # def on_button(self):
            # print(self.entry.get())

# FN FOR BUTTON:
def adder():
    main_label.set((panel1.entry.get() + panel2.entry.get()))

# CREATE GUI ELEMENTS:
main_window = tk.Tk()       # CREATE MAIN WINDOW
panel1 = Mypanel(main_window)          # CREATE A PANEL
panel2 = Mypanel(main_window)          # CREATE ANOTHER PANEL
main_label = tk.Label(main_window, text="Press button to get values.")
main_button = tk.Button(main_window, text="Get values.", command=adder)

# PACK ALL GUI ELEMENTS IN main WINDOW
panel1.pack()
panel2.pack()
main_label.pack()
main_button.pack()

# SHOW MAIN WINDOW:
main_window.mainloop()
您可以将类Tk视为主要应用程序,并将小部件放在其中。代码中应该只有一个Tk。

您需要的不是Tk类,而是一个框架:

import tkinter as tk

# CLASS FOR OWN PANEL:
class Mypanel(tk.Frame):
    def __init__(self, master=None, **kwargs):
        super().__init__(master, kwargs)
        self.label = tk.Label(self, text="Enter here:")
        self.entry = tk.Entry(self)

        self.label.pack()
        self.entry.pack()
        # def on_button(self):
            # print(self.entry.get())

# FN FOR BUTTON:
def adder():
    main_label.set((panel1.entry.get() + panel2.entry.get()))

# CREATE GUI ELEMENTS:
main_window = tk.Tk()       # CREATE MAIN WINDOW
panel1 = Mypanel(main_window)          # CREATE A PANEL
panel2 = Mypanel(main_window)          # CREATE ANOTHER PANEL
main_label = tk.Label(main_window, text="Press button to get values.")
main_button = tk.Button(main_window, text="Get values.", command=adder)

# PACK ALL GUI ELEMENTS IN main WINDOW
panel1.pack()
panel2.pack()
main_label.pack()
main_button.pack()

# SHOW MAIN WINDOW:
main_window.mainloop()
您可以将类Tk视为主要应用程序,并将小部件放在其中。一个代码中应该只有一个Tk。

您的意思是子类Tk.PanedWindow吗

试试这个:

class Mypanel(tk.PanedWindow):
    def __init__(self, mainwindow):
        super(Mypanel, self).__init__(mainwindow)
        self.label = tk.Label(self, text="Enter here:")
        self.entry = tk.Entry(self)

        self.label.pack()
        self.entry.pack()
        # def on_button(self):
            # print(self.entry.get())
并将代码中的主窗口传递给面板:

main_window = tk.Tk()       # CREATE MAIN WINDOW
panel1 = Mypanel(main_window)          # CREATE A PANEL
panel2 = Mypanel(main_window)          # CREATE ANOTHER PANEL
你的意思是子类tk.PanedWindow吗

试试这个:

class Mypanel(tk.PanedWindow):
    def __init__(self, mainwindow):
        super(Mypanel, self).__init__(mainwindow)
        self.label = tk.Label(self, text="Enter here:")
        self.entry = tk.Entry(self)

        self.label.pack()
        self.entry.pack()
        # def on_button(self):
            # print(self.entry.get())
并将代码中的主窗口传递给面板:

main_window = tk.Tk()       # CREATE MAIN WINDOW
panel1 = Mypanel(main_window)          # CREATE A PANEL
panel2 = Mypanel(main_window)          # CREATE ANOTHER PANEL

我有两个非常好的答案,有没有理由选择框架还是窗格窗口?有没有理由选择框架还是窗格窗口,因为我有两个非常好的答案。