Найти - Пользователи
Полная версия: Проблема с GUI
Начало » GUI » Проблема с GUI
1
OldSkif
Вот код:

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'
Я так понимаю, что переменные a, b, c принимают тип str, поэтому D не может совершить с ними мат. операции.
Но переменным этим я хочу давать числовые значения.
Что посоветуете?
Soteric
IntVar - это объект. Чтобы получить его численное представление нужно выполнить метод get()

http://epydoc.sourceforge.net/stdlib/Tkinter.IntVar-class.html
OldSkif
Спасибо!
Теперь другая проблема: не могу передать второму 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()()
igor.kaist
Все логично, же…
Попробуйте либо ту же переменную использовать, как для Entry так и для Label, либо биндите события (set_trace для той же IntVar).
P.S. Заканчивайте уж с этими национальными кодировками. Используйте utf-8 и юникод. Как минимум избавитесь от этих .decode(“cp1251”)
OldSkif
Игорь, спасибо вам большое за помощь.
Я поставил перед собой в корне простую задачу. Просто в силу своей “нубости” совершенно не знаю как ее решить.
Задача вот в чем: пользователь вводит число, программа выполняет над этим числом математические действия и выводит результирующее число на экран.
Как мне это можно еще осуществить? Так, как я пытаюсь это сделать, ничего не выходит, вы видите.
4kpt
Я это может делаю через одно место, но я это делаю как-то так (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()
Как-то вот так. Я не описываю виджеты одной строкой. Меня это не прет. Меня прет каждое свойство - отдельно через квадратные скобки.
После введения целого числа в Entry производим двойное нажатие мыша и получаем внизу в Label значене операции. Это хоть оно?
igor.kaist
4kpt
x = string.atoi(Entry.get())
Так зачем то? :) Да и старайтесь ловить исключения, это полезная привычка:
try:x=int(Entry.get())
except ValueError:return
4kpt
Да не, обработку исключений я бы в любом случае накидал, но по другому. Я бы просто не дал нажать кнопку пока не введт цифры или добавил бы лейбл, который писал, что цифры введены неправильно. Только после правильного введения произошло бы событие. Я просто очень коротко написал. А вообще спасибо. За return. Я уже начал забывать про эту возможность.
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