Форум сайта python.su
Вот код:
import math
from Tkinter import *
tk = Tk()
t = StringVar()#Текст
a = IntVar()#Переменные, заданные пользователем
b = IntVar()
c = IntVar()
...
Entry(tk,
textvariable = a,
takefocus=False,
).pack()
Entry(tk,
textvariable = b,
takefocus=True,
).pack()
Entry(tk,
textvariable = c,
takefocus=False,
).pack()
def prog (a, b, c):
D = (b*b) - 4*a*c
x1 = ...
x2 = ...
otvet = x1, x2
but = Button(tk,
text=k.decode("cp1251"), #надпись на кнопке
width=15,height=2,) #ширина и высота
but.bind("<Button-1>",prog(a,b,c))
but.pack()
...
tk.mainloop()
Traceback (most recent call last):
File "C:\Users\Сергей\Desktop\прог\test.py", line 44, in <module>
but.bind("<Button-1>",prog(a, b, c))
File "C:\Users\Сергей\Desktop\прог\test.py", line 37, in prog
D = (b*b) - 4*a*c
TypeError: unsupported operand type(s) for *: 'instance' and 'instance'
Отредактировано (Фев. 27, 2011 16:39:10)
Офлайн
IntVar - это объект. Чтобы получить его численное представление нужно выполнить метод get()
http://epydoc.sourceforge.net/stdlib/Tkinter.IntVar-class.html
Офлайн
Спасибо!
Теперь другая проблема: не могу передать второму Label введенное пользователем значение (с)..
import math
from Tkinter import *
tk = Tk()
t = StringVar()#Текст
a = IntVar()#Переменные, заданные пользователем
b = IntVar()
c = IntVar()
k = "Считать"#Кнопка
s = "ля-ля тополя"
t.set(s.decode("cp1251"))
Label(tk,
textvariable=t,
relief="groove",
borderwidth=3,
font=("Courier", 14, "bold"),
justify=LEFT,
width=80,
padx=10,
pady=20,
takefocus=True,
).pack()
Entry(tk,
textvariable = a,
takefocus=False,
).pack()
Entry(tk,
textvariable = b,
takefocus=True,
).pack()
Entry(tk,
textvariable = c,
takefocus=False,
).pack()
a1 = a.get() #Возвращаем переменным числовые значения
b1 = b.get()
c1 = c.get()
с2 = IntVar()
c2.set(c1) #Даем объекту с2 числовое значение с1
Label(tk,
textvariable=c2,
relief="groove",
borderwidth=3,
font=("Courier", 14, "bold"),
justify=LEFT,
width=80,
padx=10,
pady=20,
takefocus=False,
).pack()
tk.mainloop()()
Отредактировано (Фев. 27, 2011 19:37:09)
Офлайн
Все логично, же…
Попробуйте либо ту же переменную использовать, как для Entry так и для Label, либо биндите события (set_trace для той же IntVar).
P.S. Заканчивайте уж с этими национальными кодировками. Используйте utf-8 и юникод. Как минимум избавитесь от этих .decode(“cp1251”)
Офлайн
Игорь, спасибо вам большое за помощь.
Я поставил перед собой в корне простую задачу. Просто в силу своей “нубости” совершенно не знаю как ее решить.
Задача вот в чем: пользователь вводит число, программа выполняет над этим числом математические действия и выводит результирующее число на экран.
Как мне это можно еще осуществить? Так, как я пытаюсь это сделать, ничего не выходит, вы видите.
Офлайн
Я это может делаю через одно место, но я это делаю как-то так (python 2.6):
import Tkinter
import string
def cash(event):
x = string.atoi(Entry.get())
y = x/20 + x/10
Label ["text"] = "%s" % y
root = Tkinter.Tk()
Entry = Tkinter.Entry(root)
Entry.bind("<Double-Button>", cash)
Entry.pack()
Label = Tkinter.Label(root)
Label.pack()
root.mainloop()
Отредактировано (Март 3, 2011 21:09:11)
Офлайн
4kptТак зачем то? :) Да и старайтесь ловить исключения, это полезная привычка:
x = string.atoi(Entry.get())
try:x=int(Entry.get())
except ValueError:return
Офлайн
Да не, обработку исключений я бы в любом случае накидал, но по другому. Я бы просто не дал нажать кнопку пока не введт цифры или добавил бы лейбл, который писал, что цифры введены неправильно. Только после правильного введения произошло бы событие. Я просто очень коротко написал. А вообще спасибо. За return. Я уже начал забывать про эту возможность.
Офлайн