首页 > 解决方案 > 在 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'

修改后的截图: 在此处输入图像描述

标签: pythonpython-3.xtkinter

解决方案


您尚未实例化该类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)

推荐阅读