动态创建的按钮出现在另一个 - Python Tkinter

时间:2018-03-09 04:38:12

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

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

以下是代码:

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函数中。

2 个答案:

答案 0 :(得分:0)

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

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()

答案 1 :(得分:0)

可能意味着使用类变量而不是实例属性。类变量保存在类的所有实例之间共享的数据,事实上,只要有类定义,它就可以有一个值。实例属性可以具有特定于类的单个实例的值,通常采用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