【问题标题】:Dynamically Created Button Appears Over Another One - Python Tkinter动态创建的按钮出现在另一个按钮上 - Python Tkinter
【发布时间】:2018-03-09 04:38:12
【问题描述】:

我有问题。我使用类动态创建按钮。每个按钮都存储在一个列表中,因此我以后可以通过索引它们来使用它们。不过,我在放置/显示按钮时遇到了麻烦。当我创建一个按钮时,它会完美显示。当我创建另一个时,由于某种原因,它出现在第一个之上。帮助解决这个问题将不胜感激。谢谢!

代码如下:

import tkinter as tk

window = tk.Tk()
window.geometry('800x600')
placeX = 20
placeY = 20
bl = []

def direction(type_):
    pass

class SideBar():
    def __init__(self, name):
        global window
        global placeX
        global placeY
        global bl
        self.name = name
        self.placeX = placeX
        self.placeY = placeY
        self.bl = bl
        self.bl.append(self.name)
        print(self.bl)

    def create_folder(self, index):
        self.bl[index] = tk.Button(window, text = self.name, command = lambda: direction(self.name))
        self.bl[index].config(height = 3, width = 6)
        self.bl[index].place(x = self.placeX, y = self.placeY)
        self.placeY += 100


Computer = SideBar('Computer')
Documents = SideBar('Documents')

Computer.create_folder(0)
Documents.create_folder(1)

window.mainloop()

我认为问题出在 create_folder 函数的某个地方。

【问题讨论】:

  • 按钮出现在同一个地方,因为这正是你告诉他们的。您创建的每个SideBar 从全局变量中获取相同的placeX/placeY 值,这些值永远不会改变。 self.placeY += 100 行完全没有效果,因为您再也不会使用该实例变量(ComputerDocuments 有自己独立的副本)。
  • 这就是小部件永远不应该放置自己的原因。让调用者将小部件放置在它想要的任何位置。

标签: python python-3.x python-2.7 tkinter


【解决方案1】:

可能打算使用类变量而不是实例属性。类变量保存类的所有个实例之间共享的数据,事实上,只要有一个类定义,它就可以有一个值。而实例属性可以具有特定于类的单个实例的值,通常格式为self.attribute

您尝试使用self.placeY 的方式符合类变量的典型用法。删除:

self.placeY = placeY

添加:

class SideBar():
    ...
    placeY = placeY #assign global placeY's value to Sidebar.placeY
    ...

最后,替换:

self.placeY += 100

与:

SideBar.placeY += 100

【讨论】:

    【解决方案2】:

    您正在创建一个类的两个不同实例。两者都有自己的局部变量。创建一个实例并使用如下内容:

    import tkinter as tk
    
    window = tk.Tk()
    window.geometry('800x600')
    placeX = 20
    placeY = 20
    bl = []
    
    def direction(type_):
        pass
    
    class SideBar():
        def __init__(self):
            global window
            global placeX
            global placeY
            global bl
            self.name = []
            self.placeX = placeX
            self.placeY = placeY
            self.bl = []
            self.bl.append(self.name)
    
        def create_folder(self, index, name):
            self.name.append(name)
            self.bl.append(tk.Button(window, text = self.name[-1], command = lambda: direction(self.name)))
            self.bl[-1].config(height = 3, width = 6)
            self.bl[-1].place(x = self.placeX, y = self.placeY)
            self.placeY += 100
    
    
    side_bar = SideBar()
    #Documents = SideBar('Documents')
    
    side_bar.create_folder(0, 'Computer')
    side_bar.create_folder(1, 'Documents')
    
    window.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多