【问题标题】:Getting error while achieving split screen in tkinter在 tkinter 中实现分屏时出错
【发布时间】:2021-03-14 10:45:29
【问题描述】:

我想获得分屏,如果我单击左侧屏幕中的按钮,则框架应显示在右侧屏幕中。所以我使用了带有 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'

更改后的屏幕截图:

【问题讨论】:

  • 你在类而不是对象上调用.tkraise

标签: python python-3.x tkinter


【解决方案1】:

您还没有实例化Frame1Frame2 类,您正在直接传递这些类并在它们上调用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)

另外,您还没有在__init__ 函数中指定parent 参数,并且Label 应该将当前帧(self) 作为主帧而不是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的概念已经解释好here

rightframe.rowconfigure(0, weight = 1)
rightframe.columnconfigure(0, weight = 1)

【讨论】:

  • 非常感谢..它的工作,但有一个疑问..sticky='nesw' 不工作,标签不会填满整个窗口.. 是否可以解释那部分.请找到随附的屏幕截图。 @AST
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 2020-06-01
  • 2020-09-30
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多