2017-05-18 6 views
2

私は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を押してドラッグしたオブジェクトを移動します。ドラッグ中にマウスカーソルをゆっくり動かすと、すべてがうまく動作しますが、マウスカーソルが急に動かされると、ドラッグされた円は、の部分的にクリップされているように見えます() )停止をドラッグするか、減速したときに再び:

Drag and drop cropping issue illustrated

GDIを使用してwhendカバー唯一の領域にウィンドウのクライアント領域を再描画するために、画面の無効化を呼び出すときに、私はすでに、Win32のCアプリケーションで同様の問題が発生しました現在ドラッグされている円の初期位置によって決まります。

実際、私のサンプルコードで作成されたウィンドウが、ビデオゲームウィンドウのように、常に完全に再描画されているウィンドウの上に置かれている場合、要素をドラッグしている間のトリミング効果は見られず、それが引っ張られると再描画されます。

この問題を解決する方法はありますか?キャンバス設定のように、ウィンドウの無効化がクライアント領域全体またはクライアント領域全体に対して呼び出されていますか?私はTkinterを使いたいので、別のGUI API /フレームワークに切り替えることに本当に関心がありません。このコードはWindows 10でテストされています。

+1

私はLinux上でこれを複製することはできませんし、Windowsボックスにアクセスすることはできません。 tkinterがウィンドウをリフレッシュする方法を変更する方法はあまりありません。それはtkinterレベルでは公開されません。 –

答えて

0

この回答はあなたを混乱させる可能性があります。しかし、解決策は、OnMMove内でカーソルを構成することです。ここで私のためにWindowsで働いた抜粋です。

def OnMMove(event): 
    if selected is not None: 
     canvas.configure(cursor='arrow') 
     selected.x = event.x 
     selected.y = event.y 
     canvas.coords(selected.ref, event.x-10, event.y-10, event.x+10, event.y+10) 
関連する問題