Найти - Пользователи
Полная версия: Вопрос про работу Tkinter
Начало » GUI » Вопрос про работу Tkinter
1
fireqp0x
Вечер добрый!

Функция должны пинговать указаный ip.

Помогите пожалуйста разобратся, почему вот этот код работает:

#!/usr/bin/python2.7
from subprocess import call
ip = ("8.8.8.8")
def pingWH(ip):
    call('ping -c 1 %s'%ip, shell=True)
pingWH(ip)

а этот нет:

#!/usr/bin/python2.7
from subprocess import call
from Tkinter import *
a=Tk()
ip = ("8.8.8.8")
def pingWH(ip):
    call('ping -c 1 '+ip, shell=True)
b=Button(text='text')
b.pack()
b.bind("<1>",pingWH)
a.mainloop()
ошибка:
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1437, in __call__
    return self.func(*args)
  File "./1.py", line 7, in pingWH
    call('ping -c 1 '+ip, shell=True)
TypeError: cannot concatenate 'str' and 'instance' objects
dimy44
Во втором случае функции pingWH(ip) передается аргумент type instance, ниже Вы пытаетесь сложить его со строкой. Да, выше есть строковая переменная ip, но юзаться будет одноименная, аргумент pingWH(ip), если Вам не нужен там этот аргумент, дайте ему другое имя, и будет юзаться та ip, что строка
fireqp0x
Большое спасибо!

4kpt
Решение:
b.bind("<1>", lambda event: pingWH(ip))
dimy44
А зачем? Лишняя функция в бинд, а строковую переменную можно напрямую юзать. Да и вдруг ему тот аргумент пондабится для чего в дальнейшем?
4kpt
А аргумент у него никто и не забирает :)
Если понадобится
b.bind("<1>", lambda event: pingWH(ip, event))
и естественно
def pingWH(ip, event):
Код, в котором отдельные переменные функции должны искаться в пространстве имен более высокого уровня - не есть хорошо… Можно запутаться. Да и нагородить не весть чего (в случае объемлющих функций). Лучше явно передать параметром.

Я понимаю, что правило LEGB никто не отменял, но все же, по-моему мнению, для повышения читабельности…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB