как ввести значение в новом окне и передать значения wx.newindow в wx.Frame wxpython - PullRequest
0 голосов
/ 11 марта 2019

У меня есть панель с кнопкой «Динамический», и когда я нажимаю на кнопку, у меня открывается новое окно, открывающая проблему, мне нужна зона для ввода значений для редактирования параметра динамического изображения следующим образом:

enter image description here

что мой код:

import wx

class MainFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent,title="Myfirst",size=(800,580))
        self.top = wx.Panel(self, style = wx.SUNKEN_BORDER)
        self.bottom = wx.Panel(self ,style = wx.SUNKEN_BORDER)
        self.left = wx.Panel(self ,style = wx.SUNKEN_BORDER, size = (250,-1))
        st1 = wx.StaticText(self.bottom, -1, "show info ")
        self.bottom.SetBackgroundColour('white')
        dynamic=wx.Button(self.left,-1,"Dynamique",size=(110,30),pos=(50,100))
        self.Bind(wx.EVT_BUTTON, self.newwindow, dynamic)
        sizer1 = wx.BoxSizer(wx.VERTICAL)
        sizer1.Add(self.top,1,wx.EXPAND,5)
        sizer1.Add(self.bottom,1,wx.EXPAND,5)

        sizer2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer2.Add(self.left,0,wx.EXPAND,5)
        sizer2.Add(sizer1,1,wx.EXPAND,5)
        self.SetSizer(sizer2)

    def newwindow(self, event):
        secondWindow = window2(parent=self.left)
        secondWindow.Show()

class window2(wx.Frame):

    title = "new Window"

    def __init__(self,parent):
        wx.Frame.__init__(self,parent, -1,'Dynamic of image', size=(300,100))
        panel=wx.Panel(self, -1)

        self.SetBackgroundColour(wx.Colour(100,100,100))
        self.Centre()
        self.Show()

app = wx.App()
frame=MainFrame(None).Show()
app.MainLoop()

как я могу добавить зону для редактирования параметров, таких как изображения?я не уверен, что мне нужно новое окно или диалог !!

спасибо за помощь

1 Ответ

1 голос
/ 04 июня 2019

Я думаю, у вас все будет в порядке с новым новым окном. Вы можете получить зону для записи параметров с виджетами wx.TextCtrl. Вам понадобится способ экспортировать значения, введенные в wx.TextCtrl, поэтому я добавил стиль wx.TE_PROCESS_ENTER. С этим стилем, когда вы закончите печатать и нажмете Enter, вы сможете обработать введенные значения.

Также нет необходимости использовать Show() два раза (secondWindow.Show() и self.Show()). Одного из них достаточно.

Код с комментариями:

import wx

class MainFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent,title="Myfirst",size=(800,580))
        self.top = wx.Panel(self, style = wx.SUNKEN_BORDER)
        self.bottom = wx.Panel(self ,style = wx.SUNKEN_BORDER)
        self.left = wx.Panel(self ,style = wx.SUNKEN_BORDER, size = (250,-1))
        st1 = wx.StaticText(self.bottom, -1, "show info ")
        self.bottom.SetBackgroundColour('white')
        dynamic=wx.Button(self.left,-1,"Dynamique",size=(110,30),pos=(50,100))
        self.Bind(wx.EVT_BUTTON, self.newwindow, dynamic)
        sizer1 = wx.BoxSizer(wx.VERTICAL)
        sizer1.Add(self.top,1,wx.EXPAND,5)
        sizer1.Add(self.bottom,1,wx.EXPAND,5)

        sizer2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer2.Add(self.left,0,wx.EXPAND,5)
        sizer2.Add(sizer1,1,wx.EXPAND,5)
        self.SetSizer(sizer2)

    def newwindow(self, event):
        secondWindow = window2(parent=self.left)
        secondWindow.Show()

class window2(wx.Frame):

    title = "new Window"

    def __init__(self,parent):
        """
        This is similar to the class MainFrame. You define a parent wx.Panel
        and all other widgets are his childs. 
        """
        wx.Frame.__init__(self,parent, -1,'Dynamic of image', size=(300,100))
        self.panel=wx.Panel(self, -1, style=wx.SUNKEN_BORDER)

        self.st = wx.StaticText(self.panel, label='modifier bornes de la dynamique', style=wx.ALIGN_CENTER)
        #### Notice the wx.TE_PROCESS_ENTER style to trigger processing the input when
        #### Enter is pressed. Another alternative is to put a button somewhere.
        self.text = wx.TextCtrl(self.panel, size=(200, 20), style=wx.SUNKEN_BORDER|wx.TE_PROCESS_ENTER)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.st, 0, wx.EXPAND|wx.ALL, 5)
        self.sizer.Add(self.text, 0, wx.ALIGN_CENTER|wx.ALL, 5)

        self.panel.SetSizer(self.sizer)
        self.sizer.Fit(self.panel)

        #self.SetBackgroundColour(wx.Colour(100,100,100))
        self.Centre()
        #### No need to use Show() here since you already use it in MainFrame.newwindow()
        self.Show()
        #### To execute self.onEnter when Enter is pressed inside self.text
        self.Bind(wx.EVT_TEXT_ENTER, self.onEnter)

    def onEnter(self, event):
        #### Change it to fit your needs
        print(self.text.GetValue())
        self.Destroy()

app = wx.App()
frame=MainFrame(None).Show()
app.MainLoop()
...