Python 将消息框连接到按钮

Python 将消息框连接到按钮,python,button,user-interface,tkinter,messagebox,Python,Button,User Interface,Tkinter,Messagebox,我希望能够点击按钮,让消息框显示生成的代码。以下是部分代码: global s letters = [random.choice('BCDFGHJKMPQRTVWXYYZ') for x in range(19)] numbers = [random.choice('2346789') for x in range(6)] s = letters + numbers random.shuffle(s) s = ''.join(s) global Code Code = Entry(state

我希望能够点击按钮,让消息框显示生成的代码。以下是部分代码:

global s
letters = [random.choice('BCDFGHJKMPQRTVWXYYZ')  for x in range(19)]
numbers = [random.choice('2346789') for x in range(6)]
s = letters + numbers
random.shuffle(s)
s = ''.join(s)

global Code
Code = Entry(state='readonly')

def callback():
    Code = Entry(state='readonly', textvariable=s)

Code.grid(row=0, pady=20)
generate=PhotoImage(file='generate.gif')
G = Button(image=generate , command=callback, compound=CENTER)
G.grid(row=1, padx=206.5, pady=20) 

通过评论修复了一些问题:

from Tkinter import *
import random
root = Tk()

letters = [random.choice('BCDFGHJKMPQRTVWXYYZ')  for x in range(19)]
numbers = [random.choice('2346789') for x in range(6)]
s = letters + numbers
random.shuffle(s)
s = ''.join(s)

# Rather than use global variables, which is generally a bad idea, we can make a callback creator function, which takes the formerly global variables as arguments, and simply uses them to create the callback function.
def makeCallback(sVariable):
    def callback():
# This will set the text of the entry
        sVar.set(s)
    return callback

# Use a StringVar to alter the text in the Entry
sVar = StringVar(root)
# You can use an Entry for this, but it seems like a Label is more what you're looking for.
Code = Entry(root, state='readonly', textvariable=sVar)

# Create a callback function
callback = makeCallback(sVar)

Code.grid(row=0, pady=20)
generate=PhotoImage(file='generate.gif')
G = Button(root, image=None , command=callback, compound=CENTER)
G.grid(row=1, padx=206.5, pady=20) 

这是特金特,对吗?值得一提的是/标记您正在使用的GUI框架。在函数中定义函数从来都不是好形式。改为查看
lambda
函数。@我不同意这个说法。如果您试图生成一个短函数,Lambda函数是很方便的,但是在函数中定义函数是完全可以接受的,如果生成的函数比一两行长,则Lambda函数更可取。您在函数中的函数对我来说根本没有意义。它接受参数
svvariable
,然后从不使用它。您最好删除整个代码部分和
callback=makeCallback(sVar)
,然后在按钮do
command=lambda s=s:sVar.set
。实际上,有几件事您是对的-我犯了一个错误-我的意思是编写svvariable.set,实际上,这里不需要回调工厂,因为sVar是在模块级别定义的——我习惯于在类中编写GUI,在类中需要回调工厂(或lambda语句)。但在很多情况下,回收工厂是有用的;例如,如果回调需要执行多个命令,您会怎么做?lambda函数开始变得非常不可读。我要做的是,我会有一个普通函数,如果需要的话,它会调用一堆其他函数。这可以很容易地从一个类中完成。另外,我一直被教导在函数中定义一个函数总是不好的,我同意这一点,因为我不认为有必要这样做。