回答編集履歴

3

訂正2

2021/03/17 12:43

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -4,98 +4,6 @@
4
4
 
5
5
 
6
6
 
7
- canvasx, canvasy で、スクリーン上の座標から、実際のキャンバスに描画されてる座標を得られます
7
+ ~~canvasx, canvasy で、スクリーン上の座標から、実際のキャンバスに描画されてる座標を得られます~~
8
8
 
9
-
10
-
11
-
12
-
13
- ```python
14
-
15
- #!/usr/bin/env python3.8
16
-
17
-
18
-
19
- import tkinter as tk
20
-
21
-
22
-
23
-
24
-
25
- def main():
26
-
27
-
28
-
29
- root = tk.Tk()
30
-
31
- root.grid_rowconfigure([0, 1, 2], weight=1)
32
-
33
- root.grid_columnconfigure([0], weight=1)
34
-
35
- canvas = tk.Canvas(root, width=1500, height=800)
36
-
37
- hbar = tk.Scrollbar(root, orient=tk.HORIZONTAL)
38
-
39
- vbar = tk.Scrollbar(root, orient=tk.VERTICAL)
40
-
41
- status = tk.Label(root)
42
-
43
-
44
-
45
- def motion(event):
46
-
47
- x, y = event.x, event.y
48
-
49
- cx, cy = canvas.canvasx(x), canvas.canvasy(y)
50
-
51
-
52
-
53
- # スクロールした分が加算されているのが確認できるはずです
54
-
55
- status["text"] = f"{x} {y} ({cx} {cy})"
56
-
57
-
58
-
59
- hbar.config(command=canvas.xview)
60
-
61
- vbar.config(command=canvas.yview)
62
-
63
- canvas.config(
64
-
65
- xscrollcommand=hbar.set,
66
-
67
- yscrollcommand=vbar.set,
68
-
69
- scrollregion=(0, 0, 2000, 2000),
70
-
71
- )
72
-
73
-
74
-
75
- canvas.grid(row=0, column=0, sticky=tk.NSEW)
76
-
77
- vbar.grid(row=0, column=1, sticky=tk.NS)
78
-
79
- hbar.grid(row=1, column=0, sticky=tk.EW)
80
-
81
- status.grid(row=2, column=0, columnspan=2, sticky=tk.EW)
9
+ 訂正: スクロール範囲指定 (scrollregion) をされてないようなので、質問のコードに関しては関係がなさそうです。
82
-
83
-
84
-
85
- canvas.bind("<Motion>", motion)
86
-
87
- root.mainloop()
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
- if __name__ == "__main__":
96
-
97
- main()
98
-
99
-
100
-
101
- ```

2

訂正

2021/03/17 12:43

投稿

teamikl
teamikl

スコア8760

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

1

問題点について追記

2021/03/17 12:16

投稿

teamikl
teamikl

スコア8760

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