tkinter アプリケーションのスライド メニューバーを作成しようとしていますが、スレッドを適切にロックしていないことが原因であると思われる問題に遭遇しました。私はしばらくの間 Python に手を出していましたが、tkinter とスレッド化されたアプリケーションの両方に比較的慣れていません。
私のコードは次のとおりです。
class MenuBar():
def slide_out(self, event = None):
def helper():
while self.canvas.coords(self.bg)[0] > 100 and self.mouseIn:
self.canvas.move(self.bg, -5, 0)
sleep(0.01)
self.mouseIn = True
Thread(target = helper).start()
def slide_in(self, event):
self.mouseIn = False
self.canvas.coords(self.bg, 750, 0)
def __init__(self, canvas):
self.canvas = canvas
self.bgImg = ImageTk.PhotoImage(file = "Options Bar.png")
self.bg = canvas.create_image(750, 0, anchor = "nw", image = self.bgImg, tags = ("menubar", "menubarbackground"))
self.mouseIn = False
self.canvas.tag_bind("menubar", "<Enter>", self.slide_out)
self.canvas.tag_bind("menubar", "<Leave>", self.slide_in)
スタイル設定が簡単になるので、キャンバス ウィジェット内で作業しています。メニューバーにマウスオーバーすると表示されるエラーは次のとおりです。
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Python33\lib\threading.py", line 639, in _bootstrap_inner
self.run()
File "C:\Python33\lib\threading.py", line 596, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\alex\Desktop\Python - VN Work\readingscreen.py", line 12, in helper
while self.canvas.coords(self.bg)[0] > 100 and self.mouseIn:
File "C:\Python33\lib\tkinter\__init__.py", line 2264, in coords
self.tk.call((self._w, 'coords') + args))]
File "C:\Python33\lib\tkinter\__init__.py", line 2262, in <listcomp>
return [getdouble(x) for x in
ValueError: could not convert string to float: 'None'
これで、スレッドの外部で呼び出すと、不平を言っているキャンバス メソッドが機能するようになりました。また、self.canvas.coords 呼び出しの前にヘルパー関数で self.bg を参照しても、エラーは発生しないことにも言及する価値があります。ただし、役に立たない参照を追加しても、修正のようには思えません。今この問題に対処しないと、後で他の問題が悪化するだけではないかと心配しています。
問題なく self.bg を参照できるようにスレッドをロックする必要があると思いますか、それとも何か不足していますか? MenuBar クラスにロックを追加して取得し、ヘルパー メソッドで解放しようとしましたが、役に立ちませんでした。
誰でも何か考えがありますか?ありがとう。