python - 在 tkinter 中实现分屏时出错
问题描述
我想获得分屏,如果我单击左侧屏幕中的按钮,则框架应显示在右侧屏幕中。所以我使用了带有 2 个不同帧(右帧和左帧)的 Panedwindow。在左框架中提供按钮(button1 和 button2)。如果我单击按钮 1,则 Frame1(Frame1 类)应显示在右框架中,如果我单击按钮 2,则 Frame2(Frame2 类)应显示在右框架中,因此使用 raiseFrame 相应地更改框架,但如果我单击,则会低于错误按钮。
import tkinter as tk
from tkinter import *
from tkinter import ttk,Tk, BOTH, Menu
def raiseFrame(frame):
frame.tkraise()
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
m = PanedWindow(height=500, width=1000)
m.pack(side=tk.RIGHT,fill = tk.Y)
leftframe = Frame(m)
m.add(leftframe)
button1 =tk.Button(leftframe, text="first frame",command=lambda: raiseFrame(Frame1))
button1.pack(side = tk.TOP, expand=1)
button2 =tk.Button(leftframe, text="2nd frame",command=lambda: raiseFrame(Frame2))
button2.pack(side = tk.TOP, expand=1)
rightframe= Frame(m, bg="green")
m.add(rightframe)
class Frame1(tk.Frame):
def __init__(self):
tk.Frame.__init__(self, parent)
label = tk.Label(rightframe, text="1st FRAME").pack(side = tk.LEFT,fill = tk.BOTH)
class Frame2(tk.Frame):
def __init__(self):
tk.Frame.__init__(self,parent)
label = tk.Label(rightframe, text="2nd FRAME").pack(side = tk.LEFT,fill = tk.BOTH)
app = Main()
app.mainloop()
错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "C:\Users\New folder\GUI.py", line 23, in <lambda>
button1 =tk.Button(leftframe, text="first frame",command=lambda: raiseFrame(Frame1))
File "C:\Users\New folder\GUI.py", line 7, in raiseFrame
frame.tkraise()
TypeError: tkraise() missing 1 required positional argument: 'self'
解决方案
您尚未实例化该类Frame1
,并且Frame2
您正在直接传递这些类并调用tkraise
它们。您必须首先创建它们的实例并将它们堆叠起来。
frame1=Frame1(rightframe)
frame1.grid(row=0,column=0,sticky='nesw')
frame2=Frame2(rightframe)
frame2.grid(row=0,column=0,sticky='nesw')
然后将实例传递给命令
command=lambda: raiseFrame(frame1)
command=lambda: raiseFrame(frame2)
此外,您还没有在函数中指定parent
参数,__init__
并且Label
应该将当前帧 ( self
) 作为 master 而不是rightframe
。
class Frame1(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="1st FRAME").pack(side = tk.LEFT,fill = tk.BOTH)
此外,我认为创建 2 个不同的类只是为了在包含标签中有不同的文本没有意义,您可以定义一个类似这样的类
class CustomFrame(tk.Frame):
def __init__(self, parent, text=''):
tk.Frame.__init__(self,parent)
label = tk.Label(self, text=text)
label.pack(side = tk.LEFT,fill = tk.BOTH)
并有 2 个实例
frame1=CustomFrame(rightframe,text='1st Frame')
frame2=CustomFrame(rightframe,text='2nd Frame')
更新
添加以下内容以允许扩展(这里weight
已经很好地解释了的概念)
rightframe.rowconfigure(0, weight = 1)
rightframe.columnconfigure(0, weight = 1)
推荐阅读
- swift - Vapor 如何改造 EventLoopFuture
至 - azure-data-factory - ADF 中的 SAP CDS Odata URL
- django - 如何在 Django 中为模型编写模型管理器并以查询集的形式返回结果
- python - 错误:无法安装 PyCharm:未找到 JRE
- c# - C#中的struct中是否需要分号?哪种语法更合适?
- java - intellij 监视窗口显示变量为空(即使不是)
- c++ - 为什么定义与枚举类冲突?
- javascript - 一旦在 JS 函数中达到某个值,如何停止递增?
- javascript - javascript alert(0217) 调用此警报时,数字更改为 143 尝试使用多个其他数字 0817 并且警报正确 817
- python - Plotly 中可以使用的数据量是否有上限?