如何在Tkinter中将变量传递给stringvar并在标题中设置自己的位图?

时间:2017-05-11 04:54:49

标签: python linux tkinter

我在做毕业计划,我遇到了一些问题。 我已经搜索了很长时间并阅读了一些文档。但没用。 请帮助或尝试提供一些如何实现这一点的想法。 我想实现一个获取本地ip的函数,并在进入接口时使用label来显示它。我不明白如何将一个变量从“get_ip_address”传递给textvariable。

我的操作系统是Linux,python版本是2.7。

以下是一些代码:

import fcntl,struct,Tkinter,socket

def get_ip_address(ifname):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
              return socket.inet_ntoa(fcntl.ioctl(s.fileno(),
                      0x8915,struct.pack('256s',
                      ifname[:15])
              )[20:24])
top = Tkinter.Tk()
top.geometry('400x300+200+300')
ip_address = Tkinter.StringVar() 
ip_address.set(get_ip_address)
icon = top.iconbitmap('@/root/Downloads/python/sdju.xbm')
top.tk.call('wm','iconphoto',top._w,icon)
lable1 = Tkinter.Label(top,textvariable = ip_address)
lable1.pack()
top.mainloop()

1 个答案:

答案 0 :(得分:1)

请尝试以下操作。

您正在使用ip_address.get(get_ip_address) getter函数通常不带参数,此处给出的任何参数都会产生错误。你想要做的是设置值。因此,您需要拨打ip_address.set(get_ip_address)

下一个问题是,您不能通过get_ip_address来传递对该功能的引用。因此,请确保调用它,并将字符串设置为它的返回值,而不是函数本身的字符串表示形式。您应该传递网络接口的名称,您需要IP地址。

因此ip_address.set(get_ip_address)变为ip_address.set(get_ip_address('lo'))

完整代码:

import fcntl, struct, Tkinter, socket

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915,struct.pack('256s', ifname[:15]))[20:24])

top = Tkinter.Tk()
top.geometry('400x300+200+300')
ip_address = Tkinter.StringVar()
ip_address.set(get_ip_address('lo'))

icon = Tkinter.PhotoImage(file='/root/Downloads/python/sdju.xbm')
top.tk.call('wm', 'iconphoto', top._w, icon)

lable1 = Tkinter.Label(top, textvariable=ip_address)
lable1.pack()
top.mainloop()