私はPythonには新しく、現在は驚くほどシンプルに見えるTkinterで少し遊んでいます。私が使用して、このコードに見ることができるようにTkinterキャンバスの無効化の問題(移動中にオブジェクトがクリップされる)
from tkinter import *
class Point:
def __init__(self, ref, x, y):
self.ref = ref
self.x = x
self.y = y
points = []
selected = None
def OnSelect(event):
global selected
for p in points:
if event.x>=(p.x-10) and event.y>=(p.y-10) and event.x<(p.x+10) and event.y<(p.y+10):
selected = p
break
def OnMMove(event):
if selected is not None:
selected.x = event.x
selected.y = event.y
canvas.coords(selected.ref, event.x-10, event.y-10, event.x+10, event.y+10)
def OnStopDrag(event):
global selected
selected = None
def OnCreate(event):
point = canvas.create_oval(event.x-10, event.y-10, event.x+10, event.y+10, fill="black")
points.append(Point(point, event.x, event.y))
window = Tk()
window.wm_title("Python")
canvas = Canvas(window, width=800, height=600, background='white')
canvas.bind("<Button-1>", OnSelect)
canvas.bind("<B1-Motion>", OnMMove)
canvas.bind("<ButtonRelease-1>", OnStopDrag)
canvas.bind("<Button-3>", OnCreate)
canvas.pack(fill=BOTH, expand=YES)
window.mainloop()
:私は、簡単なドラッグを実装し、次のコードを(マウスの右ボタンで円を作成し、マウスの左ボタンをドラッグすることができます)を使用して効果をドロップしようとしましたcanvas.cords
を押してドラッグしたオブジェクトを移動します。ドラッグ中にマウスカーソルをゆっくり動かすと、すべてがうまく動作しますが、マウスカーソルが急に動かされると、ドラッグされた円は、の部分的にクリップされているように見えます() )停止をドラッグするか、減速したときに再び:
GDIを使用してwhendカバー唯一の領域にウィンドウのクライアント領域を再描画するために、画面の無効化を呼び出すときに、私はすでに、Win32のCアプリケーションで同様の問題が発生しました現在ドラッグされている円の初期位置によって決まります。
実際、私のサンプルコードで作成されたウィンドウが、ビデオゲームウィンドウのように、常に完全に再描画されているウィンドウの上に置かれている場合、要素をドラッグしている間のトリミング効果は見られず、それが引っ張られると再描画されます。
この問題を解決する方法はありますか?キャンバス設定のように、ウィンドウの無効化がクライアント領域全体またはクライアント領域全体に対して呼び出されていますか?私はTkinterを使いたいので、別のGUI API /フレームワークに切り替えることに本当に関心がありません。このコードはWindows 10でテストされています。
私はLinux上でこれを複製することはできませんし、Windowsボックスにアクセスすることはできません。 tkinterがウィンドウをリフレッシュする方法を変更する方法はあまりありません。それはtkinterレベルでは公開されません。 –