Python Tkinter混乱

时间:2016-01-08 13:36:08

标签: python tkinter

我是Python新手,一般编程也是堆栈溢出的新手。任何帮助将不胜感激,我只是为了获得一种感觉而搞乱代码。

我的目标是在按下按钮时将框从红色更改为蓝色。 我将var rec1c设置为'red',然后在按下按钮时将其设置为'blue'。我运行了代码,盒子从未变成蓝色。我把打印语句放进去看它是否改变了,盒子从未变成蓝色。我很困惑为什么,因为我一直按下按钮,第一个打印语句永远不会变回红色。第二次按下这两个陈述是蓝色的我认为它会改变回来之后我会把它放在那里

我的问题是

有可能实现我的目标吗? 如果是这样的话? 有没有比我更好的方式呢? 我也尝试将我的所有代码都放入问题中,但它削减了很多,所以我删除了除了必要的代码之外的所有代码。假设语法正确。

class PythonTest(Frame):
def __init__(self, parent):
    Frame.__init__(self, parent)
    self.parent = parent
    self.initUI()


def initUI(self):
    self.parent.title("Python!")
    self.style = Style()
    self.style.theme_use("default")
    self.pack(fill=BOTH, expand=1)
    self.canw = 300
    self.canh = 400

    paper = Canvas(self, width=self.canw, height=self.canh)
    paper.pack()

    self.rec1c = 'red'
    self.rec1o = 'red'
    self.rec1 = paper.create_rectangle(0, 0, 300, 300, fill=self.rec1c, outline=self.rec1o)

    self.translate = Button(self, text="Change Color!", command=self.toB)
    self.translate.place(x=50, y=50)

def toB(self):
    print(self.rec1c)
    self.rec1c = 'blue'
    print(self.rec1c)
    Tk.update

2 个答案:

答案 0 :(得分:1)

要从paper使用toB()访问self.paper,并使用self.paper.itemconfig(self.rec1, fill=self.rec1c)方法更改颜色添加toB

class PythonTest(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()


    def initUI(self):
        self.parent.title("Python!")
        #self.style = Style()
        #self.style.theme_use("default")
        self.pack(fill=BOTH, expand=1)
        self.canw = 300
        self.canh = 400

        self.paper = Canvas(self, width=self.canw, height=self.canh)
        self.paper.pack()

        self.rec1c = 'red'
        self.rec1o = 'red'
        self.rec1 = self.paper.create_rectangle(0, 0, 300, 300, fill=self.rec1c, outline=self.rec1o)

        self.translate = Button(self, text="Translate to Pig Latin", command=self.toB)
        self.translate.place(x=50, y=50)

    def toB(self):
        print(self.rec1c)
        self.rec1c = 'blue'
        print(self.rec1c)
        self.paper.itemconfig(self.rec1, fill=self.rec1c)

答案 1 :(得分:0)

更改self.rec1c的值不会将任何更改传播到使用self.rec1c定义其属性的canvas元素。 self.rec1c有一个新值,但是canvas元素仍然可以很高兴地指向旧值,并且无论self.rec1c发生什么,都会继续这样做。

如果您希望更改矩形的属性,则需要使用itemconfig显式更改它们。

self.paper = Canvas(self, width=self.canw, height=self.canh)
self.paper.pack()

self.rec1 = paper.create_rectangle(0, 0, 300, 300, fill="red", outline="red")

#later, in toB...

self.paper.itemconfig(self.rec1, fill="blue")