teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

訂正2

2021/03/17 12:43

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,51 +1,5 @@
1
1
  キャンバス・ウィジェット上の表示されてる部分の座標と、
2
2
  キャンバスに描画されている座標の違いということですか?
3
3
 
4
- canvasx, canvasy で、スクリーン上の座標から、実際のキャンバスに描画されてる座標を得られます
4
+ ~~canvasx, canvasy で、スクリーン上の座標から、実際のキャンバスに描画されてる座標を得られます~~
5
-
6
-
7
- ```python
8
- #!/usr/bin/env python3.8
9
-
10
- import tkinter as tk
11
-
12
-
13
- def main():
14
-
15
- root = tk.Tk()
16
- root.grid_rowconfigure([0, 1, 2], weight=1)
17
- root.grid_columnconfigure([0], weight=1)
18
- canvas = tk.Canvas(root, width=1500, height=800)
19
- hbar = tk.Scrollbar(root, orient=tk.HORIZONTAL)
20
- vbar = tk.Scrollbar(root, orient=tk.VERTICAL)
21
- status = tk.Label(root)
22
-
23
- def motion(event):
24
- x, y = event.x, event.y
25
- cx, cy = canvas.canvasx(x), canvas.canvasy(y)
26
-
27
- # スクロールした分が加算されているのが確認できるはずです
28
- status["text"] = f"{x} {y} ({cx} {cy})"
29
-
30
- hbar.config(command=canvas.xview)
31
- vbar.config(command=canvas.yview)
32
- canvas.config(
33
- xscrollcommand=hbar.set,
34
- yscrollcommand=vbar.set,
35
- scrollregion=(0, 0, 2000, 2000),
36
- )
37
-
38
- canvas.grid(row=0, column=0, sticky=tk.NSEW)
39
- vbar.grid(row=0, column=1, sticky=tk.NS)
40
- hbar.grid(row=1, column=0, sticky=tk.EW)
41
- status.grid(row=2, column=0, columnspan=2, sticky=tk.EW)
5
+ 訂正: スクロール範囲指定 (scrollregion) をされてないようなので、質問のコードに関しては関係がなさそうです。
42
-
43
- canvas.bind("<Motion>", motion)
44
- root.mainloop()
45
-
46
-
47
-
48
- if __name__ == "__main__":
49
- main()
50
-
51
- ```

2

訂正

2021/03/17 12:43

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -4,14 +4,6 @@
4
4
  canvasx, canvasy で、スクリーン上の座標から、実際のキャンバスに描画されてる座標を得られます
5
5
 
6
6
 
7
- 追記: 問題点 `self.Var_shiftx.get()+dx` が誤用です。(y軸も同様)
8
- スクロールバー のget() が返す値が期待通りの値かどうかを確認してみて下さい。
9
- 0.0~1.0 の割合が返されます。
10
-
11
- スクロール範囲を考慮した座標計算だと思いますが、
12
- イベント内で画面上の座標 event.x, event.y から、
13
- 実際の描画に必要な座標を得るには、canvasx, canvasy メソッドが使えます
14
-
15
7
  ```python
16
8
  #!/usr/bin/env python3.8
17
9
 

1

問題点について追記

2021/03/17 12:16

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -1,8 +1,17 @@
1
1
  キャンバス・ウィジェット上の表示されてる部分の座標と、
2
2
  キャンバスに描画されている座標の違いということですか?
3
3
 
4
- canvasy, canvasx で、スクリーン上の座標から、実際のキャンバスに描画されてる座標を得られます
4
+ canvasx, canvasy で、スクリーン上の座標から、実際のキャンバスに描画されてる座標を得られます
5
5
 
6
+
7
+ 追記: 問題点 `self.Var_shiftx.get()+dx` が誤用です。(y軸も同様)
8
+ スクロールバー のget() が返す値が期待通りの値かどうかを確認してみて下さい。
9
+ 0.0~1.0 の割合が返されます。
10
+
11
+ スクロール範囲を考慮した座標計算だと思いますが、
12
+ イベント内で画面上の座標 event.x, event.y から、
13
+ 実際の描画に必要な座標を得るには、canvasx, canvasy メソッドが使えます
14
+
6
15
  ```python
7
16
  #!/usr/bin/env python3.8
8
17