【问题标题】:How to create gtk.STOCK_* buttons from a modified list of strings?如何从修改后的字符串列表中创建 gtk.STOCK_* 按钮?
【发布时间】:2011-03-11 10:10:36
【问题描述】:

我正在尝试创建一个显示所有 gtk 股票按钮的简单程序。
我从以下位置复制了股票 ID 列表:
http://www.pygtk.org/pygtk2tutorial/ch-ButtonWidget.html
将它们粘贴到 .txt 文件中
并从文件中创建了一个列表:
stock_file = open('stock_buttons.txt')
stock_button_list = stock_file.readlines()
这使列表看起来像:
stock_button_list[0] = ' STOCK_DIALOG_INFO/n'
所以我连接了'gtk'。前缀并切掉多余的
然后我用 for 循环创建按钮:
for each_button in stock_button_list:
self.button1 = gtk.Button(None, each_button)

但是 Python 将 each_button 解释为一个字符串,我得到一堆按钮,它们的股票 ID 只是标签。 : (
如果我手动创建股票 ID 名称列表,它会起作用:
stock_button_list = [gtk.STOCK_DIALOG_INFO, gtk.STOCK_DIALOG_WARNING, etc.]
我的列表很好,看起来与股票 ID 相同,但它是一个字符串列表。

如何让 Python 将字符串识别为股票按钮 ID 的全局变量?

【问题讨论】:

    标签: python string variables pygtk gtk


    【解决方案1】:

    这么简单:

    for button in stock_button_list:
        self.button1=gtk.Button(stock=getattr(gtk,button))
    

    使用 getattr,您可以按名称访问对象或模块的所有属性。

    【讨论】:

    • 感谢您的快速回答!但是我仍然收到一个属性错误:“模块”对象没有属性?
    • 检查 stock_button_list 中的按钮列表是这样的格式:['STOCK_DIALOG_WARNING','STOCK_DIALOG_INFO',...'STOCK_XXXXXXX'],你使用 getattr 来获取 gtk 模块内部的属性,所以属性名称应该是一个存在的属性。可能您的列表使用的是 'gtk.STOCK_DIALOG_WARNING' 而不是 'STOCK_DIALOG_WARNING'
    • 知道了。我列表中的最后一项是一个空字符串。非常感谢你的帮助!解决了
    【解决方案2】:

    一个例子:

    >>> import gtk
    >>> a='STOCK_DIALOG_WARNING'
    >>> getattr(gtk, a)
    'gtk-dialog-warning'
    

    【讨论】:

      【解决方案3】:

      已解决
      正如 Revil 所说,使用 getattr(obj,name) 访问带有字符串列表的 gtk.STOCK_* 按钮。
      只需确保列表中的每个项目都与对象中的有效名称匹配,否则将引发 AttributeError。

      这是我完成的程序。它只是显示所有股票按钮。
      *注意:为了让这个程序工作,你需要在同一个目录中创建 stock_buttons.txt。只需将上述问题中链接中的股票 ID 列表粘贴到文本文件中即可。

      #!/usr/bin/env python
      
      # stock_buttons.py
      # Simple program to show all stock buttons
      # Author: oringe
      
      import pygtk
      pygtk.require('2.0')
      import gtk
      
      class stock_buttons:
      
          def __init__(self):
              self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
      
              self.window.set_title("gtk.STOCK_[Buttons]")
              self.window.connect("destroy", lambda wid: gtk.main_quit())
              self.window.connect("delete_event", lambda a1,a2:gtk.main_quit())
              self.window.set_border_width(10)
      
              # This horizontal box will contain the columns
              self.boxH = gtk.HBox(False, 0)
              self.window.add(self.boxH)
      
              # Pack the five columns into the HBox
              self.box1 = gtk.VBox(False, 0)
              self.boxH.pack_start(self.box1, True, True, 0)
              self.box2 = gtk.VBox(False, 0)
              self.boxH.pack_start(self.box2, True, True, 0)
              self.box3 = gtk.VBox(False, 0)
              self.boxH.pack_start(self.box3, True, True, 0)
              self.box4 = gtk.VBox(False, 0)
              self.boxH.pack_start(self.box4, True, True, 0)
              self.box5 = gtk.VBox(False, 0)
              self.boxH.pack_start(self.box5, True, True, 0)
      
              # Make the list of stock buttons
              stock_file = open('stock_buttons.txt')
              stock_button_list = stock_file.readlines()
      
              # Slice off excess spaces and line breaks
              i = 0
              for each_string in stock_button_list:
                  stock_button_list[i] = stock_button_list[i][2:-1]
                  i += 1
      
              # Pack 15 buttons per column
              i2 = 0
              for button in stock_button_list:
                  if i2 < 15:
                      self.button1 = gtk.Button(stock=getattr(gtk, button))
                      self.box1.pack_start(self.button1, True, True, 0)
                      self.button1.show()
                      i2 += 1
                  elif i2 > 14 and i2 < 30:
                      self.button1 = gtk.Button(stock=getattr(gtk, button))
                      self.box2.pack_start(self.button1, True, True, 0)
                      self.button1.show()
                      i2 += 1
                  elif i2 > 29 and i2 < 45:
                      self.button1 = gtk.Button(stock=getattr(gtk, button))
                      self.box3.pack_start(self.button1, True, True, 0)
                      self.button1.show()
                      i2 += 1
                  elif i2 > 44 and i2 < 60:
                      self.button1 = gtk.Button(stock=getattr(gtk, button))
                      self.box4.pack_start(self.button1, True, True, 0)
                      self.button1.show()
                      i2 += 1
                  elif i2 > 59 and i2 < 75 and button != '':  #Last item in list is empty''
                      self.button1 = gtk.Button(stock=getattr(gtk, button))
                      self.box5.pack_start(self.button1, True, True, 0)
                      self.button1.show()
                      i2 += 1
      
              self.box1.show()
              self.box2.show()
              self.box3.show()
              self.box4.show()
              self.box5.show()
              self.boxH.show()
              self.window.show()
      
      def main():
          gtk.main()
      
      if __name__ == "__main__":
          mybuttons = stock_buttons()
          main()
      

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 2020-04-21
        • 1970-01-01
        相关资源
        最近更新 更多