Wx.st c .StyledTextCtrl Полоса прокрутки - PullRequest
1 голос
/ 15 января 2020

В моем проекте я использую wx.st c .StyledTextCtrl (). Я связываю события ключа вниз и ключа вверх. Когда я хочу добавить письмо в TextCtrl, я не пропускаю событие, по некоторым причинам я использую метод AddText () для добавления текста. Когда текст длинный и полоса прокрутки (ширины экрана) открыта, я хочу, чтобы полоса прокрутки находилась в том месте, где я могу видеть добавленную букву (будет перемещаться автоматически, как и должно быть). в настоящее время полоса прокрутки всегда находится в левой части экрана. Я ищу функцию, которая может это сделать.

, когда буквы превышают ширину TextCtrl (более 300 позиций), полоса прокрутки по-прежнему не двигается. Я хочу, чтобы это было как messageTxt в правой части кадра. Вот базовый c код, который представляет мою проблему:

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()

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Очевидно, что после ключевого события происходит другое событие, которое пропускается.
Используйте 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()
0 голосов
/ 18 января 2020

Я добавил другой ответ, потому что первая проблема все еще актуальна, но не для вашего вопроса, как я ее понимаю.
Я предполагаю, что это макет вашей проблемы, если это не так, дайте мне знать, и я удалю его.
"Обновления сервера" моделируются таймером, добавляется символ, затем мы просто перемещаем курсор на 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()

enter image description here

...