wxPython - обрабатывать ввод из одного TextCtrl и отправлять вывод в другой TextCtrl?

Я уверен, что это ужасно глупый вопрос. Но я использовал Python в течение года, я прошел "Изучение Python трудным путем", я прошел учебное пособие по Zetcode WxPython, я просмотрел демонстрацию WXPython TextCtrl и потратил 2 дня, чтобы найти ответ на Google. этот, казалось бы, простой вопрос, и я не понимаю его.

Все, что я пытаюсь сделать, - это сделать очень простую тестовую игру, в которой у меня есть поле ввода, где пользователь вводит что-то вроде "получить ананас", затем нажимает [ENTER] и отправляет эту фразу в функцию, которую я сделаю, которая обрабатывает запрос, а затем отправляет вывод в поле вывода, которое говорит что-то вроде "вы не можете получить ананас". Так как я написал множество вещей в офисе на python и написал полнофункциональные финансовые модели и игры с VBA, я был уверен, что это будет легко, но кажется невозможным. И WXPython является препятствием.

Если я помещаю строковую переменную в "frame" или "panel" или в объекты класса для TC1 или TC2, то они рассматриваются как совершенно чуждые и пустые в MainLoop, независимо от того, где я помещаю переменную, она не распознается. Кажется невозможным использовать одну и ту же переменную при создании функции в TextCtrl1 и TextCtrl2 или наоборот. Я думаю, что мне нужно что-то сделать с помощью "event.skip", или, может быть, сделать слои, передавая вещи глубоко в слои WXPython, а затем снова вытаскивая их обратно, но я не уверен, куда их поместить или как сделай это.

Прежде всего, пожалуйста, скажите мне, как я могу сам найти ответы на подобные вопросы! Я чувствую себя униженным, просто спрашиваю об этом, потому что кажется, что это должно быть так легко, потому что, если бы это было трудно, оно существовало бы и получило ответ на этом сайте вопросов и ответов.

У меня весь скелет GUI выглядит хорошо, у меня работает событие нажатия клавиши "Enter", мои мультимедиа настроены и работают нормально, я знаю, как я буду настраивать свои объекты, мне просто нужно указать в правильном направлении Вот. Даже если бы вы могли просто показать мне, как взять ввод из одного textctrl и передать его без изменений в выходной textctrl только для чтения, это было бы прекрасно, и я мог бы выяснить все остальное. Я мог бы опубликовать остальную часть своего кода здесь, но я читал где-то, что было плохими манерами.

РЕДАКТИРОВАТЬ: я вставляю код здесь по просьбе потенциального ответчика.

Заранее спасибо.

import wx
from random import randint
from pygame import mixer # Load the required library


mixer.init()
mixer.music.load('sog.ogg')
mixer.music.set_volume(1.0)
mixer.music.play()

RandomSound1 = mixer.Sound('CritHit.wav')
RandomSound2 = mixer.Sound('swallow2.wav')
RandomSound3 = mixer.Sound('thunder2.wav')

#instantiate class

class MusTogButt(wx.Button):

    def __init__(self, *args, **kw):
        super(MusTogButt, self).__init__(*args, **kw)

        self.Bind(wx.EVT_BUTTON, self.MusicToggleFunction)

    def MusicToggleFunction(self, mtf):
        if mixer.music.get_busy() == True:
            print "test, is playing"
            mixer.music.stop()
        else:
            mixer.music.play()

class SoundTestButt(wx.Button):

    def __init__(self, *args, **kw):
        super(SoundTestButt, self).__init__(*args, **kw)

        self.Bind(wx.EVT_BUTTON, self.PlayRandSound)

    def PlayRandSound(self, mtf):
        randsoundnum = randint (0,100)
        if randsoundnum < 34:
            RandomSound1.play()
        elif randsoundnum  < 68:
            RandomSound2.play()
        else:
            RandomSound3.play()


class CPFInputter(wx.TextCtrl):

    def __init__(self, *args, **kw):
        super(CPFInputter, self).__init__(*args, **kw)

        self.Bind(wx.EVT_COMMAND_ENTER, self.TextEntryFunction)

    def TextEntryFunction(self, mtf):
        print "you pressed enter"


class Example(wx.Frame):

    def __init__(self, parent, title):
        super(Example, self).__init__(parent, title=title,
            size=(800, 600))


        self.InitUI()
        self.Centre()
        self.Show()


    def InitUI(self):

        panel = wx.Panel(self)

        #--------------------------------------------------------------
        #This is an event handler. It handles the pressing of Enter, only.
        def UserInputtedCommand(self):
            keycode = self.GetKeyCode()
            if keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER:
                print self.GetValue()

        hbox = wx.BoxSizer(wx.HORIZONTAL)

        fgs = wx.FlexGridSizer(3, 2, 9, 25)
        #  3 rows
        #  2 columns
        #  9 vert gap
        # 25 horizonatl gap

        OutBoxLabel = wx.StaticText(panel, label="Outbox") #notice that these do NOT have wx.expand and they do NOT expand when the window is sized.
        InBoxLabel = wx.StaticText(panel, label="Input:") #notice that these do NOT have wx.expand and they do NOT expand when the window is sized.

        #make a bunch of input text controls, under the main panel.
        InTC = wx.TextCtrl(panel)
        InTC.Bind(wx.EVT_KEY_DOWN, UserInputtedCommand)
        OutTC = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
        MusicToggle = MusTogButt(panel, label="Toggle Music Playback")
        SoundTester = SoundTestButt(panel, label="Play Random Sound")

        #Use AddMany AFTER you've built all your widgets with their specifications and put them in objects.
        fgs.AddMany([(OutBoxLabel), (OutTC, 1, wx.EXPAND),
            (InBoxLabel), (InTC, 1, wx.EXPAND), (MusicToggle), (SoundTester)])

        fgs.AddGrowableRow(0, 1)
        fgs.AddGrowableCol(1, 1)
        # So, in other words, the 1st and second textboxes can grow horizontally, and the 3rd and final textbox can grow horizontally and vertically.

        #lastly, add the FGS to the main hbox.
        hbox.Add(fgs, proportion=1, flag=wx.ALL|wx.EXPAND, border=15)
        #...and set sizer.
        panel.SetSizer(hbox)


if __name__ == '__main__':

    app = wx.App()
    Example(None, title='CPF_FunGame2_MediaTest')
    print "cpf_Fungame2_mediatest_running"
    app.MainLoop()

2 ответа

Решение

Ниже создаются два текстовых элемента управления, когда вы набираете что-то в первом и нажимаете ввод, это отображается во втором элементе управления.

В вашем коде вам не хватает style=wx.TE_PROCESS_ENTER,

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import wx
import wx.lib.sized_controls as sc

class AFrame(sc.SizedFrame):
    def __init__(self, *args, **kwds):
        super(AFrame, self).__init__(*args, **kwds)

        pane = self.GetContentsPane()

        self.tc1 = wx.TextCtrl(pane, style=wx.TE_PROCESS_ENTER)
        self.tc2 = wx.TextCtrl(pane)

        self.tc1.Bind(wx.EVT_TEXT_ENTER, self.onTc1Enter)

    def onTc1Enter(self, Evt):
        self.tc2.ChangeValue(self.tc1.GetValue())



if __name__ == "__main__":
    import wx.lib.mixins.inspection as WIT

    app = WIT.InspectableApp()
    f = AFrame(None)
    f.Show()
    app.MainLoop()

Я подозреваю, что ваша проблема связана с областью действия ваших переменных, но без более подробной информации я могу только предположить, что это может быть за проблема. Вы могли бы обработать это одним из нескольких способов:

  1. Передайте объект поля вывода этой функции, затем вы можете использовать его методы для отображения результата.
  2. Верните значение, чтобы разрешить его использование в большем объеме, чем было изначально.

Когда вы связываете с TextCtrl, попробуй это:

self.InTC.Bind(wx.EVT_TEXT, UserInputtedCommand)

def UserInputtedCommand (self, event):
    Line = self.InTC.GetValue()
Другие вопросы по тегам