【发布时间】:2017-11-14 22:13:27
【问题描述】:
我对 tkinter、canvas 和 itemconfig 有一种奇怪的行为。
我有一个小窗口,画布上填满了矩形,每个矩形都显示了调色板的颜色。我为鼠标左键和右键设置了一个事件,LMB 选择一种颜色,RMB 将单击的颜色与选定的颜色交换。绑定事件工作正常,因为在此过程中发生了其他操作(实际调色板颜色被交换)。
问题是,在第一次 LMB 和 RMB 点击时,矩形“填充”没有得到更新(或者至少屏幕上没有刷新),但是在第二次点击 RMB 时,颜色变化被反映(但颜色被交换了两次)。
更新矩形的代码是:
app.paletteCanvas.itemconfig(app.paletteColorBoxes[newColor], fill=transformColor(app,app.drawColor))
app.paletteCanvas.itemconfig(app.paletteColorBoxes[app.drawColor], fill=transformColor(app,newColor))
app 是主应用程序,paletteCanvas 是包装在“调色板窗口”中的画布,在 app.paletteColorBoxes 中我保留要更改的矩形的索引,newColor 和 app.drawColor 是要交换的原始颜色和颜色,最后 transformColor 只是将 (R,G,B) 事物转换为 #RRGGBB 字符串以供 itemconfig 理解。
所以,一切似乎都正常,除了第一次调用例程时刷新未完成,但在第二次调用时刷新完成。
我尝试了各种 .update() 和 .update_idletasks() 但没有运气。
要全面测试此行为,您可以在以下位置查看完整的应用程序:
https://github.com/zayamatias/retrotool
行为不端的函数在 retrofunctions.py/swapColor 中
你需要打开一个图像,点击一些颜色并选择“Tile Viewer/Editor”,工具完成后(可能会失败,仍然是WIP)你会看到调色板窗口。
谢谢!
顺便说一句,如果有帮助的话,我正在使用 Python 3.6.3。
【问题讨论】:
-
请不要发布完整申请的链接。没有人愿意涉足成百上千行代码。相反,创建一个小的minimal reproducible example。