Как создать кнопки gtk.STOCK_ * из измененного списка строк? - PullRequest
1 голос
/ 11 марта 2011

Я пытаюсь создать простую программу, которая отображает все стоковые кнопки gtk.
Я скопировал список биржевых идентификаторов из:
http://www.pygtk.org/pygtk2tutorial/ch-ButtonWidget.html
, вставил их в текстовый файл
и создал список из файла:
stock_file = open('stock_buttons.txt')<br> stock_button_list = stock_file.readlines()<br> Это создает список, который выглядит следующим образом:
stock_button_list[0] = ' STOCK_DIALOG_INFO/n'
Так что я объединяю 'gtk.'добавьте префикс и отрежьте лишнее
Затем я создаю кнопки с циклом for:
for each_button in stock_button_list:<br> self.button1 = gtk.Button(None, each_button)

Но Python интерпретирует каждую кнопку как строку, и я получаю кучу кнопок со стоковыми идентификаторами какпросто ярлыки.: (
Это работает, если я вручную создаю список имен идентификаторов акций:
stock_button_list = [gtk.STOCK_DIALOG_INFO, gtk.STOCK_DIALOG_WARNING, etc.]
Мой список в порядке и выглядит так же, как идентификаторы акций, но это список строк.

Как я могу заставить Python распознавать строки как глобальные переменные для идентификаторов кнопок акций ??

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Так просто:

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

Используя getattr, вы можете получить доступ ко всем атрибутам объекта или модуля по имени.

0 голосов
/ 11 марта 2011

решаемые
Как сказал Revil, используйте getattr (obj, name) для доступа к кнопкам gtk.STOCK_ * со списком строк.
Просто убедитесь, что каждый элемент в вашем списке соответствует действительному имени в объекте, в противном случае будет вызвано AttributeError.

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

#!/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()
0 голосов
/ 11 марта 2011

Пример:

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