【问题标题】:wxpython SetStatusText on StatusBar doesn't work状态栏上的 wxpython SetStatusText 不起作用
【发布时间】:2018-06-10 07:07:23
【问题描述】:

我正在通过制作一个带有菜单栏和状态栏的窗口来训练 wxpython。 我在 mac os 上,所以可能它的工作方式不同,因为我不知道我的代码有什么问题,但我在 Internet 上没有找到任何东西。

这是我的代码:

#!/usr/bin/python
# coding: utf-8

import wx

class Menus(wx.Frame):
    def __init__(self, ptitle):
        wx.Frame.__init__(self, None, 1, title = ptitle, size = (500, 300))

        menuFile = wx.Menu()
        menuFile.Append(wx.ID_OPEN, "&Open\tCTRL+o")
        menuFile.Append(wx.ID_CLOSE, "&Close\tCTRL+c")
        menuFile.AppendSeparator()
        menuFile.Append(wx.ID_EXIT, "&Quit\tCTRL+q")

        menuBar = wx.MenuBar()
        menuBar.Append(menuFile, "&File")

        self.SetMenuBar(menuBar)

        self.bar = wx.StatusBar(self, 1)
        self.bar.SetFieldsCount(2)
        self.bar.SetStatusWidths([1,1])
        self.SetStatusBar(self.bar)

        self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
        self.Bind(wx.EVT_MENU, self.OnOpen, id=wx.ID_OPEN)
        self.Bind(wx.EVT_MENU, self.OnClose, id=wx.ID_CLOSE)

    def OnOpen(self, evt):
        self.bar.SetStatusText("Choice -> open", 1)

    def OnClose(self, evt):
        self.bar.SetStatusText("Choice -> close", 1)

    def OnExit(self, evt):
        self.Destroy()

class App(wx.App):
    def OnInit(self):
        window = Menus("Window with menu")
        window.Show(True)
        self.SetTopWindow(window)
        return True

app = App()
app.MainLoop()

当我点击打开或关闭时,状态栏上没有文字,但有状态栏。如果我选择而不是将状态文本设置为在终端中打印某些内容,则它可以正常工作。我也试过你写 self.bar.SetStatusText("Text") 也不管用。

如果有人知道这个状态栏的问题在哪里,那就太好了。

谢谢

【问题讨论】:

  • 据我所知,这按预期工作。我认为您可能无法看到正在设置的文本,因为此调用:self.bar.SetStatusWidths([1,1])。如果我注释掉该行,状态栏会占据整个窗口底部(两个字段按 50/50 分割),并且您的文本会显示在右半部分。
  • 是的,当我评论这一行时它可以工作。我对其进行了测试,当我关闭鼠标时,左侧有一条消息说“关闭当前文档”,但没有打开按钮的消息。此消息是如何生成的?

标签: python macos wxpython statusbar


【解决方案1】:

使用self.bar.SetStatusWidths([1,1]),您将宽度分别设置为 1 像素和 1 像素宽。
您应该使用 [-1,-1](等于)、[-1,-2](第 2 部分是第 1 部分的两倍)等
或使用固定宽度 [150,200] 例如。

有两种类型的字段:固定宽度和可变宽度字段。对于固定宽度字段,您应该以像素为单位指定它们的(恒定)宽度。对于可变宽度字段,指定一个负数,指示字段应如何扩展:所有可变宽度字段的剩余空间根据该数字的绝对值在它们之间划分。宽度为 -2 的可变宽度字段获得的宽度是宽度为 -1 的字段的两倍,依此类推。

例如,要在状态栏右侧创建一个宽度为 100 的固定宽度字段和另外两个分别获得剩余空间的 66% 和 33% 的字段,您应该使用包含 -2 的数组,- 1 和 100。

我怀疑“关闭当前文档”消息是内部消息,非常类似于添加到菜单中的自动图标。

最后,self.bar.SetStatusText("Text") 应为self.bar.SetStatusText("Text",1),其中1 是您希望在其中显示文本的状态栏字段的索引。

例如

self.bar = wx.StatusBar(self, 1)
self.bar.SetFieldsCount(3)
self.bar.SetStatusWidths([200,-1,-2])
self.SetStatusBar(self.bar)
self.bar.SetStatusText("Second position",1)
self.bar.SetStatusText("Third position",2)

【讨论】:

  • 好的,我知道了。谢谢你的解释!
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2016-08-29
  • 2016-01-16
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多