【问题标题】:cannot import name 'messagebox' from 'tk'Error无法从“tk”错误中导入名称“messagebox”
【发布时间】:2022-01-14 16:56:00
【问题描述】:

我使用来自 Anaconda 的 Spyder ide,我只是在玩 python 并尝试对消息进行编码/解码。安装库 tkinter 和 base64 时出现很多错误。最终它运行但必须改为 pip install tk/pybase64 。 在遇到一些麻烦之后,出现了我完全不知道如何修复的新错误。互联网上的资源对我帮助不大。

错误:无法从 'tk' 导入名称 'messagebox'

import tk as tk
from tk import *
import pybase64
from tk import messagebox
tk.messagebox

root = Tk()

root.geometry("600x600")

root.title("TechVidvan Message Encryption and Decryption")


Msg = tk.StringVar()
key = tk.StringVar()
mode = tk.StringVar()
Result = tk.StringVar()

label = tk.Label(root, text='Enter Message', font=('Helvetica',10))
label.place(x=10,y=0)

mes = tk.Entry(root,textvariable=Msg, font=('calibre',10,'normal'))
mes.place(x=200,y=0)

label1 = tk.Label(root, text='e for encrypt and d for decrypt', font=('Helvetica',10))
label1.place(x=10,y=50)

l_mode = tk.Entry(root, textvariable=mode, font=('calibre',10,'normal'))
l_mode.place(x=200,y=50)

label2 = tk.Label(root, text='Enter key', font=('Helvetica',10))
label2.place(x=10,y=100)

l_key = tk.Entry(root, textvariable=key, font=('calibre',10,'normal'))
l_key.place(x=200,y=100)

label3 = tk.Label(root, text='Result', font=('Helvetica',10))
label3.place(x=10,y=150)

res = tk.Entry(root,textvariable=Result, font=('calibre',10,'normal'))
res.place(x=200,y=150)

#-------------------------------------------------------
def encode(key, msg):
    enc = []
    for i in range(len(msg)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(msg[i]) +
                     ord(key_c)) % 256)
        enc.append(enc_c)
    return pybase64.urlsafe_b64encode("".join(enc).encode()).decode()



def decode(key, enc):
    dec = []
    enc = pybase64.urlsafe_b64decode(enc).decode()
    for i in range(len(enc)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)

        dec.append(dec_c)
    return "".join(dec)


def Results():
    msg = Msg.get()
    k = key.get()
    m = mode.get()
    m.lower()
    if (m == 'e'):
        Result.set(encode(k, msg))
    elif(m== 'd'):
        Result.set(decode(k, msg))
    else:
        messagebox.showinfo('TechVidvan', 'Wrong mode entered. Try again.')



def qExit():
    root.destroy()



def Reset():
    Msg.set("")
    key.set("")
    mode.set("")
    Result.set("")


btnshow = tk.Button(root, text='Show Message', foreground='green', command=Results)
btnshow.place(x=10,y=200)

btnreset = tk.Button(root, text='Reset', foreground='red', command=Reset)
btnshow.place(x=150,y=200)

btnexit = tk.Button(root, text='Exit', foreground='black', command=qExit)
btnshow.place(x=300,y=200)


root.mainloop()

【问题讨论】:

  • 你根本不需要单独安装 tkinter 或 base64,它们都是内置的...
  • 不建议将 from x import * 删除并重试。

标签: python tkinter


【解决方案1】:

您根本不需要单独安装tkinterbase64,它们都是内置的。 (如果您的 Python 安装中没有内置 Tkinter 支持,您将需要使用 Tkinter 支持重建 Python,您不能单独安装它。)

  • 如果您确实安装了pip install tk,那么您将安装this package that is unrelated to tkinter。您需要卸载它。
  • 同样,您不需要pybase64 来执行base64 操作。最好也卸载它。
  • 第三,确保您的脚本本身没有被称为tk.py
  • 最后,如上所述,模块是tkinter,而不是tk。为简洁起见,import tkinter as tk 是很常见的。
    • 另外,使用* 导入通常不是一个好主意;你会发现你的命名空间被各种你不需要或不知道它们来自哪里的符号污染了。

【讨论】:

    【解决方案2】:

    尝试导入 tkinter,from tkinter import messagebox 你也可以对其余的导入做同样的事情

    from tkinter import * as tk
    import pybase64
    from tkinter import messagebox
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 2021-09-10
      • 2020-04-17
      • 1970-01-01
      • 2022-06-21
      • 2022-12-08
      • 2022-11-29
      • 2023-01-22
      相关资源
      最近更新 更多