【问题标题】:Python/tKinter/ttk - passing an object on button clickPython/tKinter/ttk - 在按钮点击时传递一个对象
【发布时间】:2013-01-14 05:16:49
【问题描述】:

顶级编辑:这个问题原则上已在原始线程中得到回答 - 但是,我想了解更多有关的一些基本问题。请不要直截了当地回答这个问题。如果它杂乱无章,我很高兴删除这个 Q!


与我昨天问的这个问题有关:Python/ttk/tKinter - passing an argument with a button click func?

我正在尝试一种新方法,并且我可以(在某种程度上)让它工作,但是,只有当我对函数进行“硬”编码时,我才试图避免这种情况......

我有 36 个按钮 [a-z] 和 [0-9]。当用户点击按钮时,askcolor 对话框弹出,我希望记录返回的颜色。

在类初始化中,我声明了一些变量(都将颜色值设置为白色):

class MakeGUI(Frame):
    def __init__(self,root):
        Frame.__init__(self, root)
        self.root = root
        ##colour values
        self.AVal = "#FFFFFF"
        self.BVal = "#FFFFFF"
        self.CVal = "#FFFFFF"
        etc. 

当我填充文本框时,我使用颜色变量作为背景参数:

    ## letter labels
    self.boxA = Text(self.mainframe, state='normal', width=3, height=1, background=self.AVal).grid(column=2, row=2, padx=4)
    self.boxB = Text(self.mainframe, state='normal', width=3, height=1, background=self.BVal).grid(column=3, row=2, padx=4)
    self.boxC = Text(self.mainframe, state='normal', width=3, height=1, background=self.CVal).grid(column=4, row=2, padx=4)
    etc.

然后我设置按钮:

    self.bloba = ttk.Button(self.mainframe, text="A",style= 'mainSmall.TButton', command= lambda: self.getColour("self.AVal")).grid(column=2, row=3)
    self.blobb = ttk.Button(self.mainframe, text="B",style= 'mainSmall.TButton', command= lambda: self.getColour("self.BVal")).grid(column=3, row=3)
    self.blobc = ttk.Button(self.mainframe, text="C",style= 'mainSmall.TButton', command= lambda: self.getColour(("self.CVal")).grid(column=4, row=3)

注意 - 我正在“发送” var 的字符串,因为我无法让对象正确传递 - 理想情况下我只想发送对象,但这是我可以开始工作的唯一解决方法.

然后我设置按钮功能:

def getColour(self,glyphRef):
    print self.AVal
    (triple, hexstr) = askcolor()
    if hexstr:
        eval(glyphRef+"=hexstr")
    print self.AVal

这两个打印语句仅用于监控目的,因为我弄清楚如何让它工作。

我也非常清楚eval 方法是不可取或不理想的。我只是找不到让我接近理想解决方案的替代方法....

此方法抛出错误:

#FFFFFF
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "colourPicker/colourTest.py", line 109, in <lambda>
    self.bloba = ttk.Button(self.mainframe, text="A",style= 'mainSmall.TButton', command= lambda: self.getColour("self.AVal")).grid(column=2, row=3)
  File "colourPicker/colourTest.py", line 161, in getColour
    eval(glyphRef+"=hexstr")
  File "<string>", line 1
    self.AVal=hexstr
         ^
SyntaxError: invalid syntax

为了尝试测试发生了什么,我尝试在按钮 func 中对 var 进行硬编码:

def getColour(self,glyphRef):
    print self.AVal
    (triple, hexstr) = askcolor()
    if hexstr:
        self.AVal=hexstr
    print self.AVal

这确实会导致 var 被更改:

#FFFFFF
#24d9d9

这意味着我可以编写 36 种不同的按钮点击函数,但这似乎违反直觉......尤其是当我对类函数了解甚少时,它就是要应对这种挑战!

任何建议都非常感谢。

【问题讨论】:

  • 不是答案,但你应该这样做print self.bloba。我打赌你会发现这不是你所期望的。 object.grid() 不返回值。与print self.boxA 相同。
  • 谢谢 - 我最终将初始化值放入 self.dict,然后从 click 函数中更改 dict。它与我昨天提供的我错过的解决方案结合使用!很好的故障排除提示,谢谢!

标签: python tkinter ttk


【解决方案1】:

我最终将 init 值放入 self.dict,然后从 click func 更改 dict。

所以现在初始化是:

    self.colourDict = \
    {"AVal":"#FFFFFF",
     "BVal":"#FFFFFF",
     "CVal":"#FFFFFF",
     "DVal":"#FFFFFF",
      etc. 

文本框制作者是:

    self.boxA = Text(self.mainframe, state='normal', width=3, height=1, background=self.colourDict['AVal'])
    self.boxB = Text(self.mainframe, state='normal', width=3, height=1, background=self.colourDict['BVal'])
    self.boxC = Text(self.mainframe, state='normal', width=3, height=1, background=self.colourDict['CVal'])
    etc.

然后被网格化:

    self.boxA.grid(column=2, row=2, padx=4)
    self.boxB.grid(column=3, row=2, padx=4)
    self.boxC.grid(column=4, row=2, padx=4)
    etc.

然后是按钮:

    self.bloba = ttk.Button(self.mainframe, text="A",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxA,"AVal")).grid(column=2, row=3)
    self.blobb = ttk.Button(self.mainframe, text="B",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxB,"BVal")).grid(column=3, row=3)
    self.blobc = ttk.Button(self.mainframe, text="C",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxC,"CVal")).grid(column=4, row=3)
    etc.

哪个指向按钮功能:

def getColour(self,glyphRef, value):
    (triple, hexstr) = askcolor()
    if hexstr:
        glyphRef.config(bg=hexstr)
        self.colourDict[value] = hexstr

这两者都设置了视觉颜色,并为我提供了一个可调用的 dict,我可以使用它来将结果保存在 XML 中以供以后分析。任务完成。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2014-05-08
    • 2023-03-11
    • 1970-01-01
    • 2019-07-09
    • 2012-01-06
    相关资源
    最近更新 更多