Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单选按钮tkinter传递主机值_Python_Tkinter - Fatal编程技术网

Python 单选按钮tkinter传递主机值

Python 单选按钮tkinter传递主机值,python,tkinter,Python,Tkinter,尝试使用单选按钮来选择我所指的主机,因为最终会有 只有两个,它们是固定地址 这就是错误: 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py”,第1410行,在调用中 返回self.func(*args) 文件“Untitled 2.py”,第63行,在 命令=lambda:callback\u power\u off(关闭,主机)) 文件“Untitled 2.p

尝试使用单选按钮来选择我所指的主机,因为最终会有 只有两个,它们是固定地址

这就是错误: 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py”,第1410行,在调用中 返回self.func(*args) 文件“Untitled 2.py”,第63行,在 命令=lambda:callback\u power\u off(关闭,主机)) 文件“Untitled 2.py”,第28行,在callback\u power\u off中 connection.connect((主机、端口)) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py”,第224行,meth格式 返回getattr(self.\u sock,name)(*args) TypeError:强制使用Unicode:需要字符串或缓冲区,找到实例

from Tkinter import *
from socket import *
port = 7142

on = '02 00 00 00 00'
off = '02 01 00 00 00'




def callback_power_on(data, host):
    if not host:
        print "No host given!"
        return
    print "power on!"
    connection = socket(AF_INET, SOCK_STREAM)
    connection.connect((host, port))
    connection.sendall(add_checksum(data))
    connection.close()


def callback_power_off(data, host):
    if not host:
        print "No host given!"
        return
    print "power off!"
    connection = socket(AF_INET, SOCK_STREAM)
    connection.connect((host, port))
    connection.sendall(add_checksum(data))
    connection.close()


def add_checksum(s):
    result = []
    acc = 0
    for hexcode in s.split():
        code = int(hexcode, 16)
        acc += code
        result.append(chr(code))
    result.append(chr(acc))
    return ''.join(result)

master = Tk()
host = StringVar()
Radiobutton(master, text="Silas", variable = host, value ="172.25.13.10").pack(anchor=W)
Radiobutton(master, text="Beatrice", variable = host, value ="172.25.13.12").pack(anchor=W)

#entered_host = StringVar()
#e = Entry(master, textvariable=entered_host)
#e.pack()

b = Button(
    master,
    text="Power On",
    command=lambda: callback_power_on(on, host))
    #command=lambda: callback_power_on(on, host)

b.pack()

c = Button(
    master,
    text="Power Off",
    command=lambda: callback_power_off(off, host))
    #command=lambda: callback_power_on(on, host)
c.pack()

mainloop()

我认为问题在于
connect
需要一个字符串,但您正在传递
StringVar
实例。使用
StringVar
方法
get()
检索字符串值

下面是示例的一个细微变化,请注意按钮命令函数中使用了
entered\u host.get()

from Tkinter import *
from socket import *
port = 7142

on = '02 00 00 00 00'
off = '02 01 00 00 00'


def callback_power_on(data, host):
    if not host:
        print "No host given!"
        return
    print "power on!"
    connection = socket(AF_INET, SOCK_STREAM)
    connection.connect((host, port))
    connection.sendall(add_checksum(data))
    connection.close()


def callback_power_off(data, host):
    if not host:
        print "No host given!"
        return
    print "power off!"
    connection = socket(AF_INET, SOCK_STREAM)
    connection.connect((host, port))
    connection.sendall(add_checksum(data))
    connection.close()


def add_checksum(s):
    result = []
    acc = 0
    for hexcode in s.split():
        code = int(hexcode, 16)
        acc += code
        result.append(chr(code))
    result.append(chr(acc))
    return ''.join(result)

master = Tk()

entered_host = StringVar()
e = Entry(master, textvariable=entered_host)
e.pack()

b = Button(
    master,
    text="Power On",
    command=lambda: callback_power_on(on, entered_host.get()))
b.pack()

c = Button(
    master,
    text="Power Off",
    command=lambda: callback_power_off(off, entered_host.get()))
c.pack()

mainloop()

这很有道理!.get()方法是否总是需要成为回调参数的一部分?不是这样,您只需要确保使用类似
callback\u power\u on(on,'127.0.0.1')
的字符串。或者,您可以更改函数以接受StringVar实例,并在函数内部进行转换。