项目配置方法在 Tkinter 中不起作用



我尝试将Tkinter库用于我的python小项目。 我创建了一个 500 x 500 的正方形,里面有 10000 个小正方形。

我希望当用户单击每个小方块时都会变黑。 有人可以告诉我为什么,我将不胜感激。 以下是图形代码:

from Tkinter import *
from button import *
class AppFrame(Frame):


def __init__(self):
    self.root = Tk()
    self.root.geometry = ("1000x1000")
    self.f = Frame(self.root, relief = 'sunken', width = 600, height = 600)
    self.w = Canvas(self.f,width = 505, height =505)
    ##get the x, y value whenever the user make a mouse click
    self.w.bind("<Button-1>", self.xy)
    self.bolist = []
    for k in range(1,101):
        for i in range(1, 101):
            button = Buttons(self.w, i * 5, k * 5, i * 5 + 5, k * 5 + 5)
            self.bolist.append(button)
    self.f.grid(column =0, columnspan = 4)
    self.w.grid(column = 0)
    self.root.mainloop()

def xy (self, event):
    self.x, self.y = event.x, event.y
    print (self.x, self.y)
    ##check each button if it's clicked
    for hb in self.bolist:
        if hb.clicked(self.x, self.y):
            print ("hurry")
            hb.activate()

##button.py
from Tkinter import *

class Buttons:
def __init__(self,canvas,bx,by,tx,ty):
    self.canvas = canvas
    self.rec = canvas.create_rectangle((bx,by,tx,ty),fill = "lightgray",
                                       activefill= 'black', outline = 'lightgray')

    self.xmin = bx
    self.xmax = tx
    self.ymin = by
    self.ymax = ty
    ##print (bx, by, tx, ty)
def clicked(self, px, py):
    return (self.active and self.xmin <= px <= self.xmax and
            self.ymin <= py <= self.ymax)
def activate(self):
    self.canvas.itemconfigure(slef.rec, fill = 'black')
    self.active = True

问题是您没有初始化 active 属性,因此在单元格变为活动状态之前它不存在。要解决此问题,请在__init__方法中添加self.active = False Buttons .

您在这一行中还有一个拼写错误(请注意,您使用的是slef而不是self):

self.canvas.itemconfigure(slef.rec, fill = 'black')
与画布

上的全局绑定相比,在每个单独的矩形上设置绑定会更有效。然后,可以使用绑定将 Buttons 类的实例传递给回调。这样,您就不必迭代数千个小部件来寻找单击的小部件。

为此,请使用画布的tag_bind方法。您可以这样做,以便主程序传递对单击矩形时要调用的函数的引用,然后绑定可以调用该方法并向其传递对自身的引用。

例如:

class Buttons:
    def __init__(self,canvas,bx,by,tx,ty, callback):
        ...
        self.rec = canvas.create_rectangle(...)
        self.canvas.tag_bind(self.rec, "<1>", 
            lambda event: callback(self))
        ...

class AppFrame(Frame):
    def __init__(...):
        ...
            button = Buttons(..., self.callback)
        ...
    def callback(self, b):
        b.activate()

在这里,我查看了您的代码,对其进行了调试,并进行了一些调整。它现在有效。只需将两个脚本保存在一个文件夹中并运行您的 AppFrame 脚本(本答案中的第二个)

##button.py
from Tkinter import *
class Buttons:
    def __init__(self,canvas,bx,by,tx,ty):
        self.canvas = canvas
        self.rec = canvas.create_rectangle((bx,by,tx,ty),fill = "lightgray", activefill= 'black', outline = 'lightgray')

        self.xmin = bx
        self.xmax = tx
        self.ymin = by
        self.ymax = ty
        ##print (bx, by, tx, ty)
    def clicked(self, px, py):
        return (self.xmin <= px <= self.xmax and
                self.ymin <= py <= self.ymax)
    def activate(self):
        self.canvas.itemconfigure(self.rec, fill = 'black')

from Tkinter import *
from button import *
class AppFrame(Frame):
    def __init__(self):
        self.root = Tk()
        self.root.geometry = ("1000x1000")
        self.f = Frame(self.root, relief = 'sunken', width = 600, height = 600)
        self.w = Canvas(self.f,width = 505, height =505)
        ##get the x, y value whenever the user make a mouse click
        self.w.bind("<Button-1>", self.xy)
        self.bolist = []
        for k in range(1,101):
            for i in range(1, 101):
                button = Buttons(self.w, i * 5, k * 5, i * 5 + 5, k * 5 + 5)
                self.bolist.append(button)
        self.f.grid(column =0, columnspan = 4)
        self.w.grid(column = 0)
        self.root.mainloop()

    def xy (self, event):
        self.x, self.y = event.x, event.y
        print (self.x, self.y)
        ##check each button if it's clicked
        for hb in self.bolist:
            if hb.clicked(self.x, self.y):
                print ("hurry")
                hb.activate()
newApp = AppFrame()

相关内容

  • 没有找到相关文章

最新更新