【问题标题】:Trying to find a character in a string, Python using Tkinter尝试在字符串中查找字符,Python 使用 Tkinter
【发布时间】:2026-02-17 10:55:02
【问题描述】:

我目前正在为我的学校项目制作一个刽子手游戏,但遇到了障碍。我正在尝试测试我的代码,如果您在 GUI 上按下的字符正确,是否可以在控制台中输出 yay,如果不是,则输出 boo。我试过了,除了和 if else,if else 说“文本”没有定义。 (对不起,有按钮的块,我很快就会清理它!!!) 代码如下:

#Hangman

from tkinter import *
import random

root = Tk()


word_list = ["APPLE", "PEAR", "BANNANA"]

word = word_list [random.randrange(0,2)]

#Functions
def click_1 ():
    if text in word == true:
        print ("yay")
    else:
        print ("Boo")



#Frames
hangman_frame = Frame(root).grid(row=0, column=0)
letter_frame = Frame(root).grid(row=1, column=0)

#Buttons
A = Button(letter_frame, text="A", command=click_1).grid(row=0, column=0, sticky=W)
B = Button(letter_frame, text="B", command=click_1).grid(row=0, column=1, sticky=W)
C = Button(letter_frame, text="C", command=click_1).grid(row=0, column=2, sticky=W)
D = Button(letter_frame, text="D", command=click_1).grid(row=0, column=3, sticky=W)
E = Button(letter_frame, text="E", command=click_1).grid(row=0, column=4, sticky=W)
F = Button(letter_frame, text="F", command=click_1).grid(row=0, column=5, sticky=W)
G = Button(letter_frame, text="G", command=click_1).grid(row=0, column=6, sticky=W)
H = Button(letter_frame, text="H", command=click_1).grid(row=0, column=7, sticky=W)
I = Button(letter_frame, text="I", command=click_1).grid(row=0, column=8, sticky=W)
J = Button(letter_frame, text="J", command=click_1).grid(row=0, column=9, sticky=W)
K = Button(letter_frame, text="K", command=click_1).grid(row=0, column=10, sticky=W)
L = Button(letter_frame, text="L", command=click_1).grid(row=0, column=11, sticky=W)
M = Button(letter_frame, text="M", command=click_1).grid(row=0, column=12, sticky=W)
N = Button(letter_frame, text="N", command=click_1).grid(row=1, column=0, sticky=W)
O = Button(letter_frame, text="O", command=click_1).grid(row=1, column=1, sticky=W)
P = Button(letter_frame, text="P", command=click_1).grid(row=1, column=2, sticky=W)
Q = Button(letter_frame, text="Q", command=click_1).grid(row=1, column=3, sticky=W)
R = Button(letter_frame, text="R", command=click_1).grid(row=1, column=4, sticky=W)
S = Button(letter_frame, text="S", command=click_1).grid(row=1, column=5, sticky=W)
T = Button(letter_frame, text="T", command=click_1).grid(row=1, column=6, sticky=W)
U = Button(letter_frame, text="U", command=click_1).grid(row=1, column=7, sticky=W)
V = Button(letter_frame, text="V", command=click_1).grid(row=1, column=8, sticky=W)
W = Button(letter_frame, text="W", command=click_1).grid(row=1, column=9, sticky=W)
X = Button(letter_frame, text="X", command=click_1).grid(row=1, column=10, sticky=W)
Y = Button(letter_frame, text="Y", command=click_1).grid(row=1, column=11, sticky=W)
Z = Button(letter_frame, text="Z", command=click_1).grid(row=1, column=12, sticky=W)

【问题讨论】:

  • 我不知道这段代码应该做什么。我运行它,没有任何反应。除了我必须大写 Tkinter 之外,没有看到任何错误。
  • @Fred S 它会打开一个包含所有按钮的 gui,当您单击一个按钮时,我希望它在其中一个单词中说 yay(pear bannana 等),如果不是则嘘.
  • 好的。现在我明白了。问题是您没有从按钮获取文本作为“文本”。您必须将文本传递给函数。我会尽力回答。
  • 好的建议。当您刚开始学习一门语言时,请先尝试基于基本命令行的简单程序。如果你像这样跳入 GUI 编程,会有很多信息和概念抛给你。
  • 我最近刚刚从 python 中休息并学习了 c#,所以不,谢谢。谢谢你这么好。 10/10 会推荐。 @kartikg3

标签: python user-interface if-statement tkinter try-except


【解决方案1】:

我修复了一些语法问题,并在循环中生成了按钮。让我知道这是否适合您。

#Hangman

from tkinter import *
import random, functools, string

root = Tk()

word_list = ["APPLE", "PEAR", "BANNANA"]

word = word_list [random.randrange(0,2)]

#Functions
def click_1 (text):
    if text in word:
        print ("yay")
    else:
        print ("Boo")

#Frames
hangman_frame = Frame(root).grid(row=0, column=0)
letter_frame = Frame(root).grid(row=1, column=0)

#Buttons
r = c = 0
for letter in string.ascii_uppercase:
    Button(letter_frame, text=letter, command=functools.partial(click_1, letter)).grid(row=r, column=c, sticky=W)
    c += 1
    if c > 12:
        c = 0
        r += 1

【讨论】:

  • 感谢您将我的按钮变成一个循环 - 我有点知道如何做到这一点,但这需要我很长时间,而且您为我节省了很多工作。我现在要注释所有代码,看看我是否理解它,然后尝试重写它!我可以问什么语法问题?
  • "如果 word 中的文本 == true:" 和 "from tkinter import *"。这些是我认为其他人指出的。
  • @fred s tkinter 没问题。该模块已在 python 3 中重命名为 tkinter。他可能正在使用 python 3。在版本中
  • 我在 2.7 上测试过。我的错。谢谢你的信息,我会更新我的答案。
【解决方案2】:

您遇到的问题可以使用这个帖子解决:

How to pass arguments to a Button command in Tkinter?

解决方案是在使用按钮的“命令”字段调用“click_1”函数时传递文本参数,如下所示:

  button = Tk.Button(master=frame, text='A', command= lambda: click_1("A"))

【讨论】:

    【解决方案3】:

    以这种方式测试布尔值 (== true) 是不好的做法(另外,您应该将“True”大写:)

    你想尝试更多类似的东西

    if (text in word):
    

    【讨论】:

    • 请问为什么?我看到人们说做某事是不好的做法,但我不明白为什么。它适用于其中一些事情(比如使用 Button().grid() 而不是 Button() \n varName.grid())
    • "== true" 会因为语法错误而失败,因为它认为 "true" 是一个不存在的变量。
    • @18166 “if”语句评估该语句并已经(内部)检查“真实性”。添加“== True”是多余的。它还阻止您使用其他“虚假”值。
    【解决方案4】:

    我知道你得到了答案,但我只是想我会把这个放在那里。我借用了@Fred S 的代码并写了这个:

    #Hangman
    from tkinter import *
    import random, functools, string
    
    
    class HangmanGameFrame(Frame):
        def __init__(self,
                     parent=None,
                     word_list=("APPLE", "PEAR", "BANNANA")):
            super(HangmanGameFrame, self).__init__()
            self.word_list = word_list
            self.word = self.word_list[random.randrange(0,len(word_list))]
            self.create_ui()
    
        def create_ui(self):
            #Frames
            self.hangman_frame = Frame(root).grid(row=0, column=0)
            self.letter_frame = Frame(root).grid(row=1, column=0)
    
            def create_buttons():
                #Buttons
                r = c = 0
                for letter in string.ascii_uppercase:
                    Button(self.letter_frame, text=letter, command=functools.partial(self.letter_click_handler, letter)).grid(row=r, column=c, sticky=W)
                    c += 1
                    if c > 12:
                        c = 0
                        r += 1
            create_buttons()            
    
        def configure(self, *args, **kwargs):
            if kwargs['word_list']:
                self.set_word_list(kwargs['word_list'])
                kwargs.pop('word_list', None)
            super().configure(*args, **kwargs)
    
        def set_word_list(self, word_list):
            self.word_list = word_list
            self.word = self.word_list[random.randrange(0,len(word_list))]
    
        def letter_click_handler(self, text):
            if text in self.word:
                print ("yay")
            else:
                print ("Boo")
    
    
    if __name__ == "__main__":
        root = Tk()
        hangman_frame = HangmanGameFrame(parent=root)
        hangman_frame.configure(word_list=["ZEBRA"]) 
        root.mainloop()
    

    我所做的只是重构代码以使其更简洁。使用面向对象的方法 IMO 完成 GUI 编程总是更好。它使您的代码更易于扩展和维护。这只是我从您的原始代码中编辑的一些内容。请仔细阅读它,看看您是否可以比较并获得一些指示。我相信你的老师会喜欢更好的结构。希望这会有所帮助。

    附:如果你已经知道这些概念,那么对你有好处,对我来说只是一些练习。干杯。

    【讨论】: