2015-12-31 2 views
3

Мне нужно написать программу для моего класса биологии в школе. Он должен «перевести» тройную комбинацию из четырех букв A, C, U и G [а X означает возможность присутствия A, C, U и G]. Примером является GCX .. GCX является трипплетом для аланина.UnboundLocalError: локальная переменная 'output', на которую ссылаются перед назначением

Программа должна получить вход (триплеты) и распечатать аминокислоту этого триплета в метке в моем графическом интерфейсе (tkinter).

Для облегчения просто включите пример с GCX и Alanine - он должен напечатать «Аланин [Ala]» в Lable, даже если я набрал «gcx» в записи.

from tkinter import * 
import tkinter as tk 

# Interface Construction 

# Basic Interface 
root = Tk() 
root.title("Genetic Translator") 
root.geometry("300x175") 

# Solid Label "Information for Input" 
s_label2 = Label(root, text = "\nInput Tripplet which decodes for an amino acid:\n") 
s_label2.pack() 

# Mainentry line (tripplet = trip) 
trip = Entry(root) 
trip.pack() 

# .upper() Function 
trip = str(trip) 
trip = trip.upper() 

# Output Function (Trans: trip -in- AS) 
def Input(): 
    output = tk.StringVar(output) 
    o_screen.configure(text = (output.get())) 

if trip == "GCX": 
    output = "Alanine [Ala]" 
    Input() 
else: 
    output = "Unknown tripplet!" 

# Space Label 1 
space_label1 = Label(root) 
space_label1.pack() 

# Button "Confirm" 
mainbutton = Button(root, text = "Confirm", command = Input) 
mainbutton.pack() 

# Space Label 2 
space_label2 = Label(root) 
space_label2.pack() 

# Output Screen 
o_screen = Label(root) 
o_screen.pack() 

# Mainloop function for Interface Options 
mainloop() 
+0

'output = tk.StringVar (output)' не будет помещать глобальный 'output' в stringvar. В функции имя является либо локальным, либо глобальным, а не тем и другим. –

ответ

1

Ошибки вашего кода при создании локального значения переменной внутри функции и попытки доступа к ней до ее создания. Изменение имен в функции будет исправить ошибку:

def Input(): 
    out = tk.StringVar(output) 
    o_screen.configure(text = (out.get())) 

Это будет означать, что глобальное output вы создаете в вашем случае/иначе блок будет использоваться, но код все равно не будет делать то, что вы хотите.

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

root = Tk() 
root.title("Genetic Translator") 
root.geometry("300x175") 

# Solid Label "Information for Input" 
s_label2 = Label(root, text = "\nInput Tripplet which decodes for an amino acid:\n") 
s_label2.pack() 

trip = Entry(root) 
trip.pack() 


output = {"GCX":"Alanine [Ala]"} 
# Output Function (Trans: trip -in- AS) 
def Input(): 
    o_screen.configure(text=(output.get(trip.get(),"Unknown tripplet!"))) 

# Space Label 1 
space_label1 = Label(root) 
space_label1.pack() 

# Button "Confirm" 
mainbutton = Button(root, text = "Confirm", command = Input) 
mainbutton.pack() 

# Space Label 2 
space_label2 = Label(root) 
space_label2.pack() 

# Output Screen 
o_screen = Label(root) 
o_screen.pack() 

# Mainloop function for Interface Options 
root.mainloop() 

"Unknown tripplet!" Использования в качестве аргумента по умолчанию, dict.get будет означать, если пользователь вводит что-то вы делаете не в качестве ключа в вашем dict будет означать, что будет отображаться.

+0

О, да, это прекрасно работает: благодаря вам, это очень помогло мне. Спасибо :) –

+0

И как я могу добавить больше записей в этом словаре? Так что, например, «AUG» дает выход «Метионин [Met]»? И как я могу установить команду «.upper()» в моих записях? –

+0

@ J.Doe, вы можете добавить дополнительные пары 'k: v' –

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

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