Как передать строку из текстового поля в функцию
Я пишу базовый интерфейс для моего сценария анализа журнала. Я использую GTK 2x, Glade и Python 2.7.3.
У меня есть некоторые глобальные переменные, и мне нужно изменить их в соответствии с пользовательским вводом в текстовых полях GUI. Весь макет выполнен на поляне. Любые советы, как передать строки и значения из виджетов в функции вне класса GUI?
Пример определения текстового поля из файла Glade:
<child>
<object class="GtkEntry" id="serverIDtext">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
<property name="text" translatable="yes">Server name.</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
GUI класс:
import pygtk
import gtk
import gtk.glade
from pyParse2 import *
class GUI:
def __init__(self):
builder = gtk.Builder()
builder.add_from_file("parsergui.glade")
self.window = builder.get_object("window1")
builder.connect_signals(self)
def on_window_destroy(self, widget, data = None):
gtk.main_quit()
def parseButton(self, widget, data = None):
parseLaunch()
РЕДАКТИРОВАТЬ согласно MG. совет: я попробовал ваш первый совет и подготовил что-то вроде этого:
import pygtk
import gtk
import gtk.glade
from pyParse2 import *
class GUI:
def __init__(self):
builder = gtk.Builder()
builder.add_from_file("parsergui.glade")
self.window = builder.get_object("window1")
builder.connect_signals(self)
self.sID = builder.get_object("serverIDtext")
def on_window_destroy(self, widget, data = None):
gtk.main_quit()
def parseButton(self, widget, data = None):
global serverID
serverID = self.sID
print serverID
parseLaunch()
И получил это:
<gtk.Entry object at 0x2a97a58 (GtkEntry at 0x20e9118)>
Насколько я понимаю (и, скорее всего, я ошибаюсь), я не могу использовать get_text, но должен сделать get_object, который не возвращает строку. Есть ли способ обойти это?
О_О
2 ответа
Вы можете получить доступ к записи с помощью класса Builder, как и в случае с окном.
# in __init__
self.entry = builder.get_object('serverIDtext')
Существует альтернатива, но причина ошибки или неправильного представления о том, как она работает или как она должна работать, требует небольшого количества тестов, чтобы заставить ее работать. Как правило, вы можете передать ссылку на текстовое поле обработчику через User data
параметр. На поляне, когда вы связываете parseButton
обработчик сигнала, установите User data
в текстовое поле. Теперь сложная часть: я не помню, если текстовое поле передается как widget
параметр или data
параметр и Swap
флажок контролировать это поведение.
Если у вас есть ссылка на текстовое поле, вы можете легко получить строку, вызывающую get_text()
метод.
Вы должны назвать свой виджет,
global foo_widget
foo_widget = application.get_widget('foo')
если ваш виджет назван 'foo' в GUI Builder.
Затем вы можете получить заданные пользователем значения, используя
foo_value = foo_widget.get_text()
Документацию можно найти здесь.