Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2013 00:11:13

fireqp0x
Зарегистрирован: 2013-01-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про работу Tkinter

Вечер добрый!

Функция должны пинговать указаный 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

Отредактировано fireqp0x (Янв. 10, 2013 00:14:01)

Офлайн

#2 Янв. 10, 2013 02:26:09

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Вопрос про работу Tkinter

Во втором случае функции pingWH(ip) передается аргумент type instance, ниже Вы пытаетесь сложить его со строкой. Да, выше есть строковая переменная ip, но юзаться будет одноименная, аргумент pingWH(ip), если Вам не нужен там этот аргумент, дайте ему другое имя, и будет юзаться та ip, что строка

Офлайн

#3 Янв. 10, 2013 08:50:58

fireqp0x
Зарегистрирован: 2013-01-07
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос про работу Tkinter

Большое спасибо!

Офлайн

#4 Янв. 10, 2013 14:00:20

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Вопрос про работу Tkinter

Решение:

b.bind("<1>", lambda event: pingWH(ip))



Офлайн

#5 Янв. 10, 2013 14:19:40

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Вопрос про работу Tkinter

А зачем? Лишняя функция в бинд, а строковую переменную можно напрямую юзать. Да и вдруг ему тот аргумент пондабится для чего в дальнейшем?

Офлайн

#6 Янв. 10, 2013 15:42:45

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Вопрос про работу Tkinter

А аргумент у него никто и не забирает :)
Если понадобится

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

Я понимаю, что правило LEGB никто не отменял, но все же, по-моему мнению, для повышения читабельности…



Отредактировано 4kpt (Янв. 10, 2013 15:48:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version