AttributeError: объект «str» не имеет атрибута «_root»

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

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()**

person LulZ    schedule 11.12.2016    source источник
comment
global не создает глобальных переменных. Все переменные, созданные вне функций/классов, автоматически становятся глобальными. Вы используете внутреннюю функцию global, чтобы сообщить функции, что вы хотите использовать внешнюю переменную вместо создания локальной переменной.   -  person furas    schedule 12.12.2016


Ответы (1)


stextentry = IntVar(value=stextentry)

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

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

or

stextentry = IntVar(cctk, stextentry)

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

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

Но теперь stextentry это IntVar, поэтому вам нужно использовать stextentry.get() в

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

Кстати: если да

 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()
person furas    schedule 12.12.2016