【发布时间】:2019-10-24 22:28:59
【问题描述】:
我的代码基本上是这样做的:
这显然不是我想尝试的。为了进一步澄清,我希望我的窗口看起来类似于:
from tkinter import *
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
class Encoding(tk.Tk):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.mode = StringVar()
## If I remove the next line it breaks it entirely.
self.encoding_frame = ttk.Frame(parent)
self.encrypt = ttk.Radiobutton(self.encoding_frame, text='Encrypt', variable=self.mode, value='encrypt')
self.decrypt = ttk.Radiobutton(self.encoding_frame, text='Decrypt', variable=self.mode, value='decrypt')
self.encrypt.grid(column=0, row=0, ipadx=2, sticky=W)
self.decrypt.grid(column=0, row=1, ipadx=2, sticky=W)
self.encoding_frame.grid(column=0, columnspan=3, row=2, sticky=S)
class MainApplication(tk.Frame, Encoding):
# Create a main frame here.
# Would like frames to be nested within this frame. This seems redundant but nesting with a main
# frame allows for consistent themes, and gives additional control of layout between subframes.
# Inheritance is confusing.
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.main_frame = ttk.LabelFrame(parent, text="Main Window", width=500, height=500)
self.main_frame['borderwidth'] = 3
self.main_frame['relief'] = 'raised'
self.main_frame.grid(column=0, row=0)
self.encoding = Encoding(self)
## I wrote the following line hoping that I could have main_frame become the parent frame.
self.encoding.encoding_frame = ttk.LabelFrame(self.main_frame)
if __name__ == "__main__":
app = MainApplication(root)
root.mainloop()
我显然没有做对。我重写程序的全部原因是为了让我对面向对象的代码有更好的理解/信心。我希望我能对此有更好的了解,所以任何帮助都会很棒。
【问题讨论】:
-
"#继承令人困惑。":避免
multiple inheritance,你没有Encoding.__init__(...。阅读Why are multiple instances of Tk discouraged? -
为什么要避免多重继承?另外,我不确定我是否创建了多个 Tk 实例?恐怕你的评论有点混乱。你能说得更具体一点吗?
-
不应该避免多重继承。相反,tkinter 的小部件已经继承自公共基类
Widget,它也继承自多个类,例如BaseWidget、Pack……如果您尝试进一步混合,它会使您的代码不必要地复杂化。跨度> -
另外关于多个实例,在您的代码
root = tk.Tk()中创建Tk的一个实例。然后,您的Encoding类继承自tk.Tk,当您调用它MainApplication时,它还会创建Tk的另一个实例。
标签: python python-3.x tkinter tkinter-layout