1

我最近开始学习 python,甚至最近决定尝试学习如何为我的代码提供 GUI(使用 wxPython Phoenix)。然而,就在我以为我开始掌握基础知识的时候,我尝试通过一个事件将静态文本添加到面板中。尽管显示了正确的消息,但尽管我指定了位置,但它仍显示在面板的左上角。如果我调整框架的大小,它会转到正确的位置,但显然我希望它直接去那里。

一旦我使框架变大(假设空间是问题)并使用滚动面板,我只尝试运行程序,但都没有工作。我一直在查看文档,但无法弄清楚我做错了什么。

这是代码的简化版本(我省略了 elif/else 语句,因为它们对于不同的字符串本质上是相同的):

import wx
import random

class MyPanel(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        txt1 = wx.StaticText(self, label="How many sides to your dice?")
        self.sizer.Add(txt1, 0, wx.TOP | wx.CENTER, 5)
        self.spin = wx.SpinCtrl(self, min=-200, max=200)
        self.sizer.Add(self.spin, 0, wx.BOTTOM | wx.CENTER, 5)

        txt2 = wx.StaticText(self, label="How many dice are you rolling?")
        self.sizer.Add(txt2, 0, wx.TOP | wx.CENTER, 5)
        self.spin2 = wx.SpinCtrl(self, min=-200, max=200)
        self.sizer.Add(self.spin2, 0, wx.BOTTOM | wx.CENTER, 5)

        txt3 = wx.StaticText(self, label="If you have any modifiers add them here!")
        self.sizer.Add(txt3, 0, wx.TOP | wx.CENTER, 5)
        self.spin3 = wx.SpinCtrl(self, min=-200, max=200)
        self.sizer.Add(self.spin3, 0, wx.BOTTOM | wx.CENTER, 5)

        bttn = wx.Button(self, label="Roll 'em")
        self.sizer.Add(bttn, 0, wx.ALL | wx.CENTER, 10)
        bttn.Bind(wx.EVT_BUTTON, self.on_push)

        self.size = wx.BoxSizer(wx.VERTICAL)
        box = wx.StaticBox(self, wx.ID_ANY, """Your Roll Results will display here!
        """)
        self.size.Add(box, 0, wx.ALL | wx.CENTER, 5)
        self.sizer.Add(self.size, 0, wx.ALL | wx.CENTER, 5)

        self.SetSizer(self.sizer)

    def on_push(self, event):
        d_size = self.spin.GetValue()
        d_amount = self.spin2.GetValue()
        mod = self.spin3.GetValue()

        mx_am = d_size * d_amount
        mn_am = d_amount
        bot_quart = mx_am * 0.25
        half = mx_am / 2
        three_quart = mx_am - bot_quart

        if int(d_size) < 0 or int(d_amount) < 0:
            message = "Sorry, you entered a negative where that is impossible."
            errtxt = wx.StaticText(self, label=message)
            self.size.Add(errtxt, 0, wx.BOTTOM | wx.ALIGN_CENTER, 5)

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Dice Roller')

        self.panel = MyPanel(self)

        self.Centre()
        self.Show()

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    app.MainLoop()

就像我说的,errtext 首先出现在框架的左上角,然后在调整框架大小时下降到正确的位置。非常感谢任何可能的帮助(特别是如果您能告诉我如何将 errtext 放入静态框中)。

4

1 回答 1

0

self.Layout()由于嵌套的sizers.
AStaticBox也可能不是您结果的最佳选择。
StaticBox 带有自己的sizera StaticBoxSizer,用于呈现静态信息。
SpinCtrl's,正如您所观察到的那样,它带有一个最小值,所以我建议将其设置为 6 而不是 -200。
我冒昧地对您的代码进行了一些小的调整,包括使错误文本成为屏幕的一个组成部分,而不是临时添加它。
您是否也打算临时删除它?

import wx
import random

class MyPanel(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        txt1 = wx.StaticText(self, label="How many sides to your dice?")
        self.sizer.Add(txt1, 0, wx.TOP | wx.CENTER, 5)
        self.spin = wx.SpinCtrl(self, min=-200, max=200)
        self.sizer.Add(self.spin, 0, wx.BOTTOM | wx.CENTER, 5)

        txt2 = wx.StaticText(self, label="How many dice are you rolling?")
        self.sizer.Add(txt2, 0, wx.TOP | wx.CENTER, 5)
        self.spin2 = wx.SpinCtrl(self, min=-200, max=200)
        self.sizer.Add(self.spin2, 0, wx.BOTTOM | wx.CENTER, 5)

        txt3 = wx.StaticText(self, label="If you have any modifiers add them here!")
        self.sizer.Add(txt3, 0, wx.TOP | wx.CENTER, 5)
        self.spin3 = wx.SpinCtrl(self, min=-200, max=200)
        self.sizer.Add(self.spin3, 0, wx.BOTTOM | wx.CENTER, 5)

        bttn = wx.Button(self, label="Roll 'em")
        self.sizer.Add(bttn, 0, wx.ALL | wx.CENTER, 10)
        bttn.Bind(wx.EVT_BUTTON, self.on_push)

        self.size = wx.BoxSizer(wx.VERTICAL)
        self.box = wx.TextCtrl(self, wx.ID_ANY, "Results", style=wx.TE_READONLY)
        self.errtxt = wx.StaticText(self, -1, label="")
        self.size.Add(self.box, 0, wx.ALL | wx.CENTER, 5)
        self.size.Add(self.errtxt, 0, wx.ALL | wx.CENTER, 5)
        self.sizer.Add(self.size, 0, wx.ALL | wx.EXPAND, 5)

        self.SetSizer(self.sizer)

    def on_push(self, event):
        d_size = self.spin.GetValue()
        d_amount = self.spin2.GetValue()
        mod = self.spin3.GetValue()

        mx_am = d_size * d_amount
        mn_am = d_amount
        bot_quart = mx_am * 0.25
        half = mx_am / 2
        three_quart = mx_am - bot_quart

        if int(d_size) < 0 or int(d_amount) < 0:
            message = "Sorry, you entered a negative where that is impossible."
            self.errtxt.SetLabel(message)
        else:
            self.errtxt.SetLabel("")
        self.box.SetValue(str(three_quart))
        self.Layout()

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Dice Roller')

        self.panel = MyPanel(self)

        self.Centre()
        self.Show()

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    app.MainLoop()

在此处输入图像描述

于 2020-07-17T18:13:01.463 回答