2015-07-30 2 views
1

Введения:Невозможно преобразовать TkInter значения поля ввода строки для целочисленных значений

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

Предыстория мой вопрос:

Я имею проблему, призывающую целые числа от поля ввода Tkinter. Настройка выполняется следующим образом: у меня есть фрейм с меткой дескриптора, поле ввода, кнопка подтверждения и метка подтверждения. Дизайн, который я имею в виду, заключается в том, что пользователь вводит номер, нажимает кнопку подтверждения, что приводит к сохранению введенного ввода и обновлению метки подтверждения. Эта часть я не имея какой-либо вопрос с и работает как надеялись ....

from tkinter import * 

root = Tk() 
root.geometry('450x700+10+10') 
root.title("Design Suite Version: 1.0") 


#Creating a labelframe for my entry box/button and confirmation label 
myframe2 = LabelFrame(root, text = '2: Limit state design selections:') 
myframe2.grid(row=0, column=1, padx=5, pady=5, sticky = 'nw') 

#Label identifying input I expect in my entry box... 
Label(myframe2, 
     text="Proposed Member Depth:", 
     justify = LEFT).grid(row=21, column=0, padx=5, pady=5) 

#Constructing the function for the self updating label 
def Selection6(): 
    #text expected in the confirmation label 
    labeltext6 = "Depth(mm) = " + str(var6.get()) 
    #configuring the updating label 
    label6.config(text = labeltext6, fg='red', padx=5, pady=5) 

#confirmation label location 
label6 = Label(myframe2) 
#confirmation label location 
label6.grid(row=27, column=0, padx=0, pady=5) 

#set what var is here 
var6 = IntVar() 
# initializing the choice 
var6.set('0') 

#this is my first entry box 
entry6 = Entry(myframe2, textvariable=var6, width = 25) 
entry6.grid(row=25, column=0, padx=5, pady=5) 
#this is my first button, when clicked, runs Selection6 
button = Button(myframe2, text="Click to Confirm",width = 20, 
       command = Selection6) 
button.grid(row=26, column=0, padx=5, pady=0) 

########################################################################## 
#Creating a 2nd label for my entry box/button and confirmation label 
Label(myframe2, 
     text="Proposed Member Width:", 
     justify = LEFT).grid(row=28, column=0,padx=5, pady=5) 


def Selection6a(): 
    labeltext6a = "Width(mm) = " + str(var6a.get()) 
    label6a.config(text = labeltext6a, fg='red', padx=5, pady=5) 

label6a = Label(myframe2) 
label6a.grid(row=31, column=0, padx=0, pady=5) 

var6a = IntVar() 
var6a.set('0') 

entry6a = Entry(myframe2, textvariable=var6a, width = 25) 
entry6a.grid(row=29, column=0, padx=5, pady=5, sticky = 'w') 

button = Button(myframe2, text="Click to Confirm",width = 20, 
       command = Selection6a) 
button.grid(row=30, column=0, padx=5, pady=0) 
mainloop() 

Начальное издание:

Где я изначально испытывал трудности, когда я пытался получить переменные входные сигналы от двух моих входа ящики (выше) и использовать их в дальнейшем в моей программе (ниже) с моей GUI через добавление следующего кода ...

########################################################################## 
#Creating a 3rd label for my button and confirmation label 
Label(myframe2, 
    text="Member Modulus:", 
    justify = LEFT).grid(row=32, column=0,padx=5, pady=5) 


def Selection7(): 
    labeltext7 = "Modulus(mm cubed) = ", 
    + (((str(var6a.get()) * (str(var6.get()))**2))/6) 
    label7.config(text = labeltext7, fg='red', padx=5, pady=5) 

label7 = Label(myframe2) 
label7.grid(row=34, column=0, padx=0, pady=5) 

var7 = IntVar() 
var7.set('0') 


button = Button(myframe2, text="Click for Modulus",width = 20, 
       command = Selection7) 
button.grid(row=33, column=0, padx=5, pady=0) 
mainloop() 

Когда я пытаюсь получить две переменные var6.get() и var6a .get(), чтобы использовать в функции для обновления метки, я столкнулся с ошибкой следующим образом:

labeltext7 = "Modulus(mm cubed) = " + (((str(var6a.get()) * (str(var6.get()))**2))/6)TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int' Exception in Tkinter callback 

Покушение Fix:

Я попытался преобразовать строку в целое число, переписав свою функцию следующим образом ....

def Selection7(): 
labeltext7 = "Modulus(mm cubed) = ", 
+ (((int(var6a.get()) * (int(var6.get()))**2))/6) 
label7.config(text = labeltext7, fg='red', padx=5, pady=5) 

Текущий выпуск:

Когда я звоните Selection7() через button = Button(myframe2, text="Click for Modulus" Я не получаю вычисленное значение до labeltext7. Теперь скрипт выполняется отлично, без ошибок, это моя проблема, я не могу получить вычисление для вывода функции ... любые комментарии, рекомендации или предложения приветствуются!

Некоторые из многих сообщений, которые были предложены на сайте, который я читал, но не могу найти свой ответ на:

How to get values from entry box with tkinter

tkinter set values in entry box

https://stackoverflow.com/questions/26935846/tkinter-entry-box-issues

Python posting answer from function to entry box in GUI

http://effbot.org/tkinterbook/entry.htm

UPDATE1:

Привет, спасибо, что нашли время, чтобы прокомментировать и ответить. Я включил документ для объяснения того, чего я надеялся достичь с помощью моей функции, надеюсь, это добавит некоторую дополнительную ясность в запрос.

Я сломал свой компактный код на мелкие кусочки, а также вынул запятую в соответствии с рекомендациями.

Вот переработанная часть кода, которую я до сих пор не могу получить, чтобы вывести желаемую функцию, любую помощь оценили.

Label(myframe2, 
    text="Member Modulus:", 
    justify = LEFT).grid(row=32, column=0,padx=5, pady=5) 

""" 
Selection 7()_Member Modulus: 

Modulus for a rectangular section: 
(Width of member x depth of member squared) divided by 6 
width:var6a depth:var6 
""" 

def Selection7(): 
    wdth = int(var6a.get()) 
    dpth = int(var6.get()) 
    dpthsqrd = int(dpth**2) 
    wdth_dpthsqrd = int((wdth * dpthsqrd)) 
    mod = int(wdth_dpthsqrd/6) 

    labeltext7 = "Modulus (mm cubed) = " 
    + int(mod) 
    label7.config(text = labeltext7, fg='red', padx=5, pady=5) 

label7 = Label(myframe2) 
label7.grid(row=34, column=0, padx=0, pady=5) 

var7 = IntVar() 
var7.set('0') 


button = Button(myframe2, text="Click for Modulus",width = 20, 
       command = Selection7) 
button.grid(row=33, column=0, padx=5, pady=0) 
mainloop() 

UPDATE1.1:

Привет всем, в UPDATE 1, я должен был расширен на то, что мой вопрос был. Проблема заключалась в том, что расчет в defSelection7() не отображался в графическом интерфейсе на labeltext7, как надеялся ... текст Modulus (mm cubed) = отображался в графическом интерфейсе, когда был активирован Selection7, но расчет int(mod) не был.

UPDATE2:

По счастливой ноте, моя проблема решена, я сумел получить defSelection7(), чтобы отобразить int(mod) часть labeltext7 путем перемещения int(mod) вверх линию и включал ,.

См. Ниже пересмотренный код.

""" 
Selection 7()_Member Modulus: 

Modulus for a rectangular section: 
(Width of member x depth of member squared) divided by 6 
width:var6a depth:var6 
""" 

def Selection7(): 
    wdth = int(var6a.get()) 
    dpth = int(var6.get()) 
    dpthsqrd = (dpth**2) 
    wdth_dpthsqrd = (wdth * dpthsqrd) 
    mod = (wdth_dpthsqrd/6) 


labeltext7 = "Modulus (mm cubed) = ", mod 
label7.config(text = labeltext7, fg='red', padx=5, pady=5) 

label7 = Label(myframe2) 
label7.grid(row=34, column=0, padx=0, pady=5) 

var7 = IntVar() 
var7.set('0') 


button = Button(myframe2, text="Click for Modulus",width = 20, 
       command = Selection7) 
button.grid(row=33, column=0, padx=5, pady=0) 
mainloop() 

Я счастлив, что у меня есть функционирование GUI, как надеялся. Я был бы немного счастливее, если бы кто-нибудь мог опубликовать ссылку для меня, чтобы прочитать, которая поможет мне определить, почему моя ревизия работает, я сжал labeltext7 = "Modulus (mm cubed) = " + int(mod) от UPDATE1 к этой версии labeltext7 = "Modulus (mm cubed) = ", mod UPDATE2, и мой графический интерфейс затем обновился, как ожидалось, потянув и отобразив расчет int(mod) правильно «labeltext7».

+0

проблемы, как это гораздо проще отлаживать, если вы не пытаетесь сделать так много в одной строке кода , Получите первую переменную в одном из операторов, преобразуйте ее в следующую, используйте ее в выражении в другом и добавьте ее в метку в другую. Это позволяет вам проверять каждое промежуточное значение. Нет никаких бонусных очков для сжатия всего этого в одну строку. –

+0

Привет, Брайан, спасибо за быстрый ответ и рекомендацию, справедливую точку, сделанную на борту, я расширил часть кода, с которым я борюсь, и добавил документную строку, чтобы добавить некоторую ясность и облегчить мне помощь. необходимость. – Eoin

+0

Итак, что он делает сейчас? Отображение неправильного значения? Сбои? Выброс ошибки? –

ответ

0

Удаление запятой должно работать:

def Selection7(): 
    labeltext7 = "Modulus(mm cubed) = " 
    + (((int(var6a.get()) * (int(var6.get()))**2))/6) 
    label7.config(text = labeltext7, fg='red', padx=5, pady=5) 

Еще лучше:

def Selection7(): 
    width = int(var6a.get()) 
    labeltext7 = "Modulus(mm cubed) = " + (width**3/6) 
    label7.config(text = labeltext7, fg='red', padx=5, pady=5) 
+0

Привет, Эрик, спасибо, что обратились к моей просьбе о помощи. Я обновил свой код, чтобы отразить сделанные предложения, но я все еще не могу создать требуемый вывод. Я также включил docstring, чтобы добавить некоторую ясность в то, что я пытаюсь сделать. Если бы вы могли рассмотреть, когда получите шанс, и предложите, где я могу ошибиться, то это будет оценено по достоинству. – Eoin

+0

@Eoin: извините, я был в отпуске. Вам удалось решить вашу проблему? Если нет, можете ли вы разместить свой текущий текущий код в нижней части своего вопроса? –

+0

@Eoin: если я могу добавить общие советы: не используйте StringVar, IntVar ..., если у вас нет веских оснований для этого (обычно это значение, которое используется в нескольких местах). И дайте значимые имена вашим переменным и функции: Selection7 следует называть computeModulus, например. –

Смежные вопросы