在Python3+GTK3中获取文本
这可能更多是一个 python3
的问题,而不是 gtk3
的问题。在下面这段代码中,print(numele) 正常工作,也就是说,connect
函数 self.nument.connect("activate",self.get_nument)
是没问题的。
from gi.repository import Gtk, GObject
class EntryWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Entry Demo")
self.set_size_request(100, 50)
grid=Gtk.Grid()
self.add(grid)
#Create Entry nument
self.nument = Gtk.Entry()
self.numlab = Gtk.Label()
self.numlab.set_text("Number Of Element")
self.nument.set_text("Number Of Element")
self.nument.set_editable("TRUE")
grid.attach(self.numlab, 0,2,1,1)
grid.attach(self.nument, 1,2,1,1)
#Connect Entry nument
self.nument.connect("activate",self.get_nument)
#Create Entry from numele
for i in range(1,numele+1):
self.entry = Gtk.Entry()
self.entry.set_text("Hello World")
self.entry.set_editable("FALSE")
grid.attach(self.entry, 0,2+i,1,1)
def get_nument(self,entry):
numele= self.nument.get_text()
print(numele)
win = EntryWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
但是,在 for loop
中,它无法访问 numele 的值。
$python3 hw3.py
Traceback (most recent call last):
File "hw3.py", line 35, in <module>
win = EntryWindow()
File "hw3.py", line 24, in __init__
for i in range(1,numele+1):
NameError: global name 'numele' is not defined
我刚接触 python,所以我认为 numele 是 get_nument 函数内部的私有变量。有什么好的方法可以在函数外部使用它(也就是变成公共的)呢?
请帮帮我。
编辑:在 ptomato 的回复后 我确实尝试了这个,使用了:
#Connect Entry nument
self.nument.connect("activate",self.get_nument)
print(self.numele)
并将函数定义为:
def get_nument(self,entry):
self.numele= self.nument.get_text()
结果却出现了错误:
$ python3 test.py
Traceback (most recent call last):
File "test.py", line 35, in <module>
win = EntryWindow()
File "test.py", line 21, in __init__
self.nument.connect("activate",self.get_nument)
AttributeError: 'EntryWindow' object has no attribute 'get_nument'
2 个回答
这段代码有几个错误,我不太清楚你想要实现什么。你可能是想根据第一个输入框里的数字,生成一些Gtk.Entries(输入框)。所以,你需要把循环放到get_nument
这个方法里去。不过这样做还是会出错,因为get_nument
的缩进太多了。此外,你还需要把Gtk.Entry里的字符串转换成整数。
最后,网格(grid)需要成为一个属性,这样才能在get_nument
里访问到。
结果应该像这样:
from gi.repository import Gtk, GObject
class EntryWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Entry Demo")
self.set_size_request(100, 50)
self.grid=Gtk.Grid()
self.add(self.grid)
#Create Entry nument
self.nument = Gtk.Entry()
self.numlab = Gtk.Label()
self.numlab.set_text("Number Of Element")
self.nument.set_editable("TRUE")
self.grid.attach(self.numlab, 0,2,1,1)
self.grid.attach(self.nument, 1,2,1,1)
#Connect Entry nument
self.nument.connect("activate",self.get_nument)
def get_nument(self,entry):
numele= self.nument.get_text()
print(numele)
#Create Entry from numele
for i in range(1,int(numele)+1):
entry = Gtk.Entry()
entry.set_text("Hello World")
entry.set_editable("FALSE")
entry.show()
self.grid.attach(entry, 0,2+i,1,1)
win = EntryWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
不过这段代码还是有问题,比如如果输入了一个较小的数字,网格里的输入框不会被移除。
你想的方向完全正确。numele
这个变量是局部变量,所以在函数结束时它会被删除。你可以选择把这个值通过return
返回,或者把它存储为self.numele
。这样做的话,它就会保存在你的EntryWindow
对象里,这样就能在函数结束后继续使用。
另外,你可能需要在使用range()
之前先把numele
转换成整数,方法是用int(numele)
...