2016-12-11 8 views
0

Я пытаюсь создать программу caesar cipher, используя tkinter, когда я пытаюсь преобразовать запись от пользователя из строки в Int, я получаю эту ошибку: AttributeError: объект str 'не имеет атрибута' _root '. Я уже пробовал использовать 'stextentry = int (stextentry)', и я знаю, что это работает, но мне нужно использовать другую версию этой строки кода для этого скрипта для работы над другой программой. Я не знаю, как избавиться от ошибки, поэтому я надеюсь, что кто-то может мне помочь, кстати, это не домашнее задание, и это не имеет ничего общего со школой.AttributeError: объект 'str' не имеет атрибута '_root'

from tkinter import * 
def Encryption(): 

    ptextentry = ptext.get() 
    stextentry = stext.get() 
    stextentry = IntVar(stextentry)# <------------------- Error is here 
    alpha = "abcdefghijklmnopqrstuvwxyz" 
    cipher = " " 
    for c in ptextentry: 
     if c in alpha: 
      cipher += alpha[(alpha.index(c)+stextentry) % (len(alpha))] 
    print (cipher) 
global P_Text_E, P_Text_L, S_K_L, S_K_E, plain_text, cctk 
cctk = Tk() 
ptext = StringVar() 
stext = StringVar() 
P_Text_L = Label(cctk, text="Enter plain text:").grid(row=0, column=0) 
P_Text_E = Entry(cctk, textvariable=ptext).grid(row=0, column=1) 
S_K_L = Label(cctk, text="Enter shift key:").grid(row=1, column=0) 
S_K_E = Entry(cctk, textvariable=stext).grid(row=1, column=1) 
Encrypt_B = Button(cctk, text="Encrypt plain text", command = Encryption).grid(row=2, columnspan =3) 
Exit_cctk_B = Button(cctk, text="Exit").grid(row=3, columnspan =3) 
cctk.title("Caesar Cipher Program") 
cctk.mainloop()** 
+0

'global' не создает глобальных переменных. Все переменные, созданные за пределами функций/классов автоматически, являются глобальными. Вы используете функцию 'global' внутри, чтобы сообщить функции, что вы хотите использовать внешнюю переменную вместо создания локальной переменной. – furas

ответ

1
stextentry = IntVar(value=stextentry) 

один аргумент без value= трактуется как parent, так что вы можете сделать

stextentry = IntVar(cctk) 
stextentry.set(stextentry) 

или

stextentry = IntVar(cctk, stextentry) 

, но вы могли бы сделать в одной строке

stextentry = IntVar(value=stext.get()) 

Но теперь stextentry является IntVar, так что вы должны использовать stextentry.get() в

cipher += alpha[(alpha.index(c) + stextentry.get()) % (len(alpha))] 

BTW: если вы

var = Widget(...).grid(...) 
var = Widget(...).pack(...) 

затем присвоить None к var потому grid()/pack() всегда возвращается None

Вы должны сделать в две строки

var = Widget(...) 
var.grid(...) 

или без переменной

Widget(...).grid(...) 

EDIT: полный код - более читаемым: лучше имена переменных, пустые строки.

import tkinter as tk 
import string 

# --- constants --- (UPPER_CASE names) 

ALPHA = string.ascii_lowercase 
LENGTH = len(ALPHA) 

# --- functions --- (lower_case names) 

def encryption(): 

    cipher = "" 

    for char in plain_text.get(): 
     if char in ALPHA: 
      cipher += ALPHA[(ALPHA.index(char) + shift_int.get()) % LENGTH] 

    result_text.set(cipher) 

    print(cipher) 

# --- main --- 

cctk = tk.Tk() 
cctk.title("Caesar Cipher Program") 

plain_text = tk.StringVar() 
shift_int = tk.IntVar() 
result_text = tk.StringVar() 

l = tk.Label(cctk, text="Enter plain text:", anchor="e") 
l.grid(row=0, column=0, sticky="e") 

e = tk.Entry(cctk, textvariable=plain_text) 
e.grid(row=0, column=1) 

l = tk.Label(cctk, text="Enter shift key:", anchor="e") 
l.grid(row=1, column=0, sticky="e") 

e = tk.Entry(cctk, textvariable=shift_int) 
e.grid(row=1, column=1) 

b = tk.Button(cctk, text="Encrypt plain text", command=encryption) 
b.grid(row=2, columnspan=2) 

l = tk.Label(cctk, text="Result:", anchor="e") 
l.grid(row=3, column=0, sticky="e") 

l = tk.Label(cctk, textvariable=result_text, anchor="w") # place for result 
l.grid(row=3, column=1, sticky="w") 

b = tk.Button(cctk, text="Exit", command=cctk.destroy) 
b.grid(row=4, columnspan=2) 

cctk.mainloop()