我正在尝试为基于文本的应用程序创建一个tkinter输出窗口

时间:2017-07-14 19:43:12

标签: python multithreading python-3.x tkinter

我有一个不断接受文本和输出文本的脚本(它是一个基于文本的游戏)

我想通过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())

1 个答案:

答案 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函数。有很多选择。

主要是获取用户答案的​​值,使用该答案测试问题,然后将结果打印到文本框。