1

在我的项目中,我使用 wx.stc.StyledTextCtrl()。我绑定了 key down 和 key up 的事件。当我想在 TextCtrl 中添加一个字母时,我不会跳过该事件,出于某些原因,我使用 AddText() 方法来添加一个文本。当文本很长并且 ScrollBar(屏幕宽度)打开时,我希望 ScrollBar 位于我可以看到添加的字母的位置(会自动移动)。目前 ScrollBar 总是停留在屏幕的左侧。我正在寻找可以做到这一点的功能。

当字母超过 TextCtrl 的宽度(超过 pos 300)时,ScrollBar 仍然不会移动。我希望它像框架右侧的 messageTxt 一样。这是一个提出我的问题的基本代码:

import wx
import wx.stc

def on_key_down(event):
    pass
def on_key_up(event):
    key_code = event.GetKeyCode()
    messageTxt.AddText(chr(key_code))

app = wx.App()
frame = wx.Frame(None, -1, title='2', pos=(0, 0), size=(500, 500))
frame.Show(True)
messageTxt = wx.stc.StyledTextCtrl(frame, id=wx.ID_ANY, pos=(0, 0), size=(300, 300),
                                     style=wx.TE_MULTILINE, name="File")
messageTxt.Bind(wx.EVT_KEY_DOWN, on_key_down)
messageTxt.Bind(wx.EVT_KEY_UP, on_key_up)
messageTxt2 = wx.stc.StyledTextCtrl(frame, id=wx.ID_ANY, pos=(320, 0), size=(150, 150),
                                   style=wx.TE_MULTILINE, name="File")

app.SetTopWindow(frame)
app.MainLoop()

4

2 回答 2

2

很明显,在关键事件之后发生了另一个事件,而该事件被错过了。在绑定到键事件的函数中
使用。event.Skip()

Skip(self, skip=True) 此方法可用于事件处理程序内部,以控制是否在当前事件返回后调用绑定到此事件的其他事件处理程序。

如果没有 Skip(或等效地,如果使用 Skip(false)),将不再处理该事件。如果调用了 Skip(true),则事件处理系统继续为该事件搜索进一步的处理函数,即使它已经在当前处理程序中处理过。

通常,建议跳过所有非命令事件以允许进行默认处理。然而,命令事件通常不会被跳过,因为通常单个命令(例如按钮单击或菜单项选择)只能由一个处理程序处理。

import wx
import wx.stc

def on_key_down(event):
    event.Skip()
    pass
def on_key_up(event):
    key_code = event.GetKeyCode()
    messageTxt.AddText(chr(key_code))
    event.Skip()

app = wx.App()
frame = wx.Frame(None, -1, title='2', pos=(0, 0), size=(500, 500))
frame.Show(True)
messageTxt = wx.stc.StyledTextCtrl(frame, id=wx.ID_ANY, pos=(0, 0), size=(300, 300),
                                     style=wx.TE_MULTILINE, name="File")
messageTxt.Bind(wx.EVT_KEY_DOWN, on_key_down)
messageTxt.Bind(wx.EVT_KEY_UP, on_key_up)
messageTxt2 = wx.stc.StyledTextCtrl(frame, id=wx.ID_ANY, pos=(320, 0), size=(150, 150),
                                   style=wx.TE_MULTILINE, name="File")

app.SetTopWindow(frame)
app.MainLoop()
于 2020-01-15T19:14:08.707 回答
0

我添加了一个不同的答案,因为第一个问题仍然有效,只是不适用于您的问题,正如我所解释的那样。
我认为这是您的问题的模型,如果不是,请告诉我,我将其删除。
“服务器更新”是通过计时器模拟的,添加了字符,然后我们只需将光标向右移动 1 个字符。

import wx
import wx.stc

server_sends=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','T','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','T']

class MyFrame(wx.Frame):
    def __init__(self, parent, id=wx.ID_ANY, title=""):
        super(MyFrame, self).__init__(parent, id, title)
        self.SetSize((500,500))
        self.panel = wx.Panel(self, -1 , size=(500,500))
        self.messageTxt = wx.stc.StyledTextCtrl(self.panel, id=wx.ID_ANY, pos=(0, 0), size=(300, 300),
                                     style=wx.TE_MULTILINE, name="File")
        self.messageTxt2 = wx.stc.StyledTextCtrl(self.panel, id=wx.ID_ANY, pos=(320, 0), size=(150, 150),                                   style=wx.TE_MULTILINE, name="File")
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(500)
        self.cnt = 0
        self.Show()

    def OnTimer(self, event):
        print (server_sends[self.cnt])
        self.Server_Update(server_sends[self.cnt])
        self.cnt += 1
        if self.cnt > len(server_sends) - 1 :
            self.timer.Stop()

    def Server_Update(self,char):
        self.messageTxt.AddText(char)
        self.messageTxt.CharRight()

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None,title="The Main Frame")
    app.MainLoop()

在此处输入图像描述

于 2020-01-18T11:56:03.027 回答