回答編集履歴

1

コード追記

2017/03/10 10:34

投稿

can110
can110

スコア38266

test CHANGED
@@ -1 +1,151 @@
1
1
  `TextCtrl`の[ShowPosition(self, pos)](https://wxpython.org/Phoenix/docs/html/wx.TextCtrl.html#wx.TextCtrl.ShowPosition)で目的の動作ができないでしょうか?
2
+
3
+
4
+
5
+ 2017/03/10 検証コード書いてみました。
6
+
7
+ --
8
+
9
+ ポイントは`event.Position`は行位置だが`ShowPosition`は先頭からの文字列位置で指定しなければいけないというところです。
10
+
11
+ ただし、スクロールバーをマウスでつまんで動かすとうまく動作しますが、マウスホイールやテキストコントロール内での上下キーでの位置更新にはスクロールイベント発生しないようで、同期しません。
12
+
13
+ おそらくもっと正しい方法があると思います。残念。
14
+
15
+
16
+
17
+ ```Python
18
+
19
+
20
+
21
+ import sys
22
+
23
+ import wx
24
+
25
+
26
+
27
+ class MyForm(wx.Frame):
28
+
29
+ # ----------------------------------------------------------------------
30
+
31
+ def __init__(self):
32
+
33
+ wx.Frame.__init__(self, None, wx.ID_ANY,"RT_diff")
34
+
35
+
36
+
37
+ splitter = wx.SplitterWindow(self, wx.ID_ANY, style=wx.SP_LIVE_UPDATE)
38
+
39
+ splitter.SetMinimumPaneSize(100)
40
+
41
+ self.panel1 = wx.Panel(splitter, wx.ID_ANY, style=wx.BORDER_SUNKEN)
42
+
43
+ self.panel2 = wx.Panel(splitter, wx.ID_ANY, style=wx.BORDER_SUNKEN)
44
+
45
+ self.text_1 = wx.TextCtrl(self.panel1, wx.ID_ANY, style=wx.TE_MULTILINE|wx.VSCROLL)
46
+
47
+ self.text_2 = wx.TextCtrl(self.panel2, wx.ID_ANY, style=wx.TE_MULTILINE|wx.VSCROLL)
48
+
49
+ self.text_1.Bind(wx.EVT_SCROLLWIN, self.onScrollWin1)
50
+
51
+ self.text_2.Bind(wx.EVT_SCROLLWIN, self.onScrollWin2)
52
+
53
+
54
+
55
+ # ダミーデータ
56
+
57
+ a = ""
58
+
59
+ for i in range(100):
60
+
61
+ a = a + ("%03d_abcde\n" %(i))
62
+
63
+ self.text_1.SetValue(a)
64
+
65
+ self.text_2.SetValue(a)
66
+
67
+
68
+
69
+ lbox_layout = wx.BoxSizer(wx.VERTICAL)
70
+
71
+ lbox1 = wx.BoxSizer(wx.HORIZONTAL)
72
+
73
+ lbox1.Add(self.text_1, -1,wx.EXPAND)
74
+
75
+ lbox_layout.Add(lbox1,-1,wx.EXPAND)
76
+
77
+
78
+
79
+ rbox_layout = wx.BoxSizer(wx.VERTICAL)
80
+
81
+ rbox1 = wx.BoxSizer(wx.HORIZONTAL)
82
+
83
+ rbox1.Add(self.text_2, -1,wx.EXPAND)
84
+
85
+ rbox_layout.Add(rbox1,-1,wx.EXPAND)
86
+
87
+
88
+
89
+
90
+
91
+ self.panel1.SetSizer(lbox_layout)
92
+
93
+ self.panel2.SetSizer(rbox_layout)
94
+
95
+
96
+
97
+ splitter.SplitVertically(self.panel1,self.panel2)
98
+
99
+
100
+
101
+ # src,dst : 同期元、先のTextCtrl
102
+
103
+ # srcYPos : 行位置
104
+
105
+ def syncScroll(self, src, dst, srcYPos):
106
+
107
+ dstTxtPos = dst.XYToPosition( 0, srcYPos) # 行列位置→文字列長位置に
108
+
109
+ dst.ShowPosition( dstTxtPos) # 文字列長基準の位置を指定しなければいけないようだ
110
+
111
+ print( "srcYPos[%d] -> dstTxtPos(%d)" % (srcYPos,dstTxtPos))
112
+
113
+
114
+
115
+ def onScrollWin1(self, event):
116
+
117
+ print("on1:" + repr(event.Position)) # event.Positionは行位置のようだ
118
+
119
+ self.syncScroll( self.text_1, self.text_2, event.Position)
120
+
121
+ event.Skip()
122
+
123
+
124
+
125
+ def onScrollWin2(self, event):
126
+
127
+ print("on2:" + repr(event.Position))
128
+
129
+ self.syncScroll( self.text_2, self.text_1, event.Position)
130
+
131
+ event.Skip()
132
+
133
+
134
+
135
+ # ----------------------------------------------------------------------
136
+
137
+ # Run the program
138
+
139
+ if __name__ == "__main__":
140
+
141
+ app = wx.App(False)
142
+
143
+ frame = MyForm()
144
+
145
+ frame.Show()
146
+
147
+ app.MainLoop()
148
+
149
+ ```
150
+
151
+