我有一个不断接受文本和输出文本的脚本(它是一个基于文本的游戏)
我想通过tkinter GUI而不是控制台
运行它Python : Converting CLI to GUI
这个问题完美地回答了如何转换" print"进入GUI插入。
问题在于我的游戏显然会经历大量的循环,这会搞砸" app.mainloop()"因为它永远不会运行(然后GUI永远不会显示)或者你先运行它,它不会让任何其他东西运行。
我想我可以尝试并以某种方式错开这些循环,但这似乎非常hackish。我也可以尝试修改我的整个代码库以在app.mainloop()内部运行,但我真正认为我需要的是多线程。问题是,我不知道如何做到这一点。
还有一些其他问题,但它们要么不起作用,要么没有多大意义: Tkinter with multiple threads
Run process with realtime output to a Tkinter GUI
感谢。
编辑:非常简化的代码:
def moveNorth():
print('You have moved north')
def interpreter(command):
if command == 'go north':
moveNorth()
else:
print('invalid command')
def listener():
playerchoice = sys.stdin.readline().strip()
return playerchoice
if __name__ == '__main__':
print('Welcome')
while playing:
interpreter(listener())
答案 0 :(得分:1)
我认为你可能会使它变得比它需要的更复杂。
对于Tkinter来说,至少将控制台交互更改为GUI交互非常简单。
我能给出的最简单的例子是使用Entry
字段表示用户输入,并使用Text
窗口小部件作为输出。
以下是使用Tkinter将基于控制台的游戏移动到GUI的简单示例。
控制台编号猜谜游戏:
import random
print("simple game")
print("-----------")
random_num = random.randint(1, 5)
print(random_num)
x = True
while x == True:
#Input for user guesses.
guess = input("Guess a number between 1 and 5: ")
if guess == str(random_num):
#Print answer to console.
print("You win!")
x = False
else:
print("Try again!")
以下是同一游戏的Tkinter GUI示例:
import tkinter as tk
import random
root = tk.Tk()
entry_label = tk.Label(root, text = "Guess a number between 1 and 5: ")
entry_label.grid(row = 0, column = 0)
#Entry field for user guesses.
user_entry = tk.Entry(root)
user_entry.grid(row = 0, column = 1)
text_box = tk.Text(root, width = 25, height = 2)
text_box.grid(row = 1, column = 0, columnspan = 2)
text_box.insert("end-1c", "simple guessing game!")
random_num = random.randint(1, 5)
def guess_number(event = None):
#Get the string of the user_entry widget
guess = user_entry.get()
if guess == str(random_num):
text_box.delete(1.0, "end-1c") # Clears the text box of data
text_box.insert("end-1c", "You win!") # adds text to text box
else:
text_box.delete(1.0, "end-1c")
text_box.insert("end-1c", "Try again!")
user_entry.delete(0, "end")
# binds the enter widget to the guess_number function
# while the focus/cursor is on the user_entry widget
user_entry.bind("<Return>", guess_number)
root.mainloop()
正如您所看到的,GUI的代码更多,但大多数是GUI设计。
您需要更改的主要部分是使用输入和输入作为答案,并使用insert vs print作为响应。其余的只是设计的东西。
如果您想让问题保持连续性,您可以使用新问题更新标签,或者甚至可以为每个新问题使用tkinters askstring
函数。有很多选择。
主要是获取用户答案的值,使用该答案测试问题,然后将结果打印到文本框。