在Python3+GTK3中获取文本

0 投票
2 回答
815 浏览
提问于 2025-04-17 23:31

这可能更多是一个 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 个回答

0

这段代码有几个错误,我不太清楚你想要实现什么。你可能是想根据第一个输入框里的数字,生成一些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()

不过这段代码还是有问题,比如如果输入了一个较小的数字,网格里的输入框不会被移除。

0

你想的方向完全正确。numele这个变量是局部变量,所以在函数结束时它会被删除。你可以选择把这个值通过return返回,或者把它存储为self.numele。这样做的话,它就会保存在你的EntryWindow对象里,这样就能在函数结束后继续使用。

另外,你可能需要在使用range()之前先把numele转换成整数,方法是用int(numele)...

撰写回答