Python 缩放从类创建的ttk.Frame
我正在尝试使用另一个框架创建Python 3.7+Tkinter应用程序,该框架可以通过单击按钮打开: 我使用Tkinter(主题TK)创建了一个类,并希望使用ttk.Frame创建几个类。按钮将在帧之间切换。我现在的问题是,我无法使框架调整大小并将“nesw”粘贴到主根类。我假设我对ttk.Frame做了一些错误的事情,但我不能理解这个问题。 我补充说 但这似乎没有帮助。。。 整个代码:Python 缩放从类创建的ttk.Frame,python,user-interface,tkinter,ttk,Python,User Interface,Tkinter,Ttk,我正在尝试使用另一个框架创建Python 3.7+Tkinter应用程序,该框架可以通过单击按钮打开: 我使用Tkinter(主题TK)创建了一个类,并希望使用ttk.Frame创建几个类。按钮将在帧之间切换。我现在的问题是,我无法使框架调整大小并将“nesw”粘贴到主根类。我假设我对ttk.Frame做了一些错误的事情,但我不能理解这个问题。 我补充说 但这似乎没有帮助。。。 整个代码: import tkinter as tk from tkinter import ttk from t
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedTk
class MainApp(ThemedTk):
def __init__(self):
ThemedTk.__init__(self)
self.set_theme('equilux', themebg=True)
self.title('Test App')
self.style = ttk.Style(self)
self.DESKTOP_WIDTH = self.winfo_screenwidth()
self.DESKTOP_HEIGHT = self.winfo_screenheight()
self.WIDTH = int(self.DESKTOP_WIDTH / 4)
self.HEIGHT = int(self.DESKTOP_HEIGHT / 2.5)
self.geometry(f'{self.WIDTH}x{self.HEIGHT}+{int(self.DESKTOP_WIDTH / 3)}+{int(self.DESKTOP_HEIGHT / 4)}')
self.minsize(width=self.WIDTH, height=self.HEIGHT)
self._frame = None
self.switch_frame(MainLogin)
def switch_frame(self, frame_class):
"""Destroys current frame and replaces it with a new one."""
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.grid(row=0, column=0)
class MainLogin(ttk.Frame):
def __init__(self, master):
ttk.Frame.__init__(self, master, padding=(5, 5, 5, 5), borderwidth=10, relief='ridge', sticky='nesw')
self.grid(row=0, column=0)
self.rowconfigure(0, weight=3)
self.columnconfigure(0, weight=3)
self.master = master
self.userid = tk.StringVar()
self.password = tk.StringVar()
self.remember = tk.StringVar()
self.frame_login = ttk.Frame(self, padding=(10, 10, 10, 10), borderwidth=2, relief='ridge')
self.label_welcome = ttk.Label(self.frame_login, text='Open App')
self.label_user = ttk.Label(self.frame_login, text='User ID:')
self.entry_user = ttk.Entry(self.frame_login, textvariable=self.userid)
self.label_password = ttk.Label(self.frame_login, text='Password:')
self.entry_password = ttk.Entry(self.frame_login, textvariable=self.password, show='*')
self.check_remember = ttk.Checkbutton(self.frame_login, text='Remember me', variable=self.remember, onvalue='yes', offvalue='no')
self.button_login = ttk.Button(self.frame_login, text='Login', command=lambda: MainLogin.login(self.userid, self.password))
self.button_register = ttk.Button(self.frame_login, text='Register', command=self.register)
self.grid_widgets()
self.resize_widgets()
def grid_widgets(self):
self.frame_login.grid(row=0, column=0, sticky='nesw')
self.label_welcome.grid(row=0, column=0, columnspan=2, pady=30, sticky='n')
self.label_user.grid(row=1, column=0, padx=10, pady=5, sticky='e')
self.entry_user.grid(row=1, column=1, padx=10, pady=5, sticky='w')
self.label_password.grid(row=2, column=0, padx=10, pady=5, sticky='e')
self.entry_password.grid(row=2, column=1, padx=10, pady=5, sticky='w')
self.check_remember.grid(row=3, column=0, columnspan=2, pady=5, sticky='n')
self.button_login.grid(row=4, column=0, padx=10, pady=5, ipadx=30, sticky='e')
self.button_register.grid(row=4, column=1, padx=10, pady=5, ipadx=30, sticky='w')
def resize_widgets(self):
self.columnconfigure(0, weight=3)
self.rowconfigure(0, weight=3)
self.frame_login.columnconfigure(0, weight=3)
self.frame_login.columnconfigure(1, weight=3)
@staticmethod
def login(userif, password):
print('Login button pressed')
def register(self):
print('Register button pressed')
if __name__ == '__main__':
root = MainApp()
root.mainloop()
由于在任何时候根窗口中只有一个帧,最简单的解决方案是使用
pack
而不是grid
,因为您不必担心配置行和列
def switch_frame(self, frame_class):
"""Destroys current frame and replaces it with a new one."""
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack(fill="both", expand=True)
有了这个小小的变化,MainLogin
框架将填满窗口
如果您喜欢使用网格
,可以将上述代码中对pack
的调用替换为:
self._frame.grid(row=0, column=0, sticky="nsew")
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
“我有错误(wm_grid()得到了一个意外的关键字参数‘row’)”-在代码中没有任何地方可以调用
wm_grid
。请你的问题包括实际的错误。我用错误更新了代码。根据插入方式和位置的不同,我会遇到不同的错误。现在的错误是:“TypeError:create()参数1必须是str或None,而不是Frame”。如果我将tk.tk.uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。评论部分的代码无法阅读。很抱歉。。。我更新了我的帖子。你的代码运行没有错误。非常感谢!它真的帮助了我!
self._frame.grid(row=0, column=0, sticky="nsew")
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)