我阅读了一些关于tkinter的教程(基本),并学习了如何创建一个主循环并为其添加gui元素。还学会了如何将操作绑定到按钮小部件。现在在命令行上绘制tkinter画布
我想做到这一点:
- 推出Tkinter的帆布
- 能够将这些命令后,从控制台读取命令和更新画布。
例如: 谨在控制台上的参数和某些图形元素命令被添加到画布(和画布后更新)。
是可能的事情,也许threading有关? 你能否指出我认为最合理的一个方向?
我阅读了一些关于tkinter的教程(基本),并学习了如何创建一个主循环并为其添加gui元素。还学会了如何将操作绑定到按钮小部件。现在在命令行上绘制tkinter画布
我想做到这一点:
例如: 谨在控制台上的参数和某些图形元素命令被添加到画布(和画布后更新)。
是可能的事情,也许threading有关? 你能否指出我认为最合理的一个方向?
下面是通过标准input
函数从控制台抓取用户输入的简单演示。这种技术有点笨重,因为我们必须明确告诉Tkinter通过单击Button(或其他GUI事件)来获取输入字符串,但这对您的应用程序可能不是什么大问题。
import tkinter as tk
root = tk.Tk()
stuff = tk.StringVar()
display = tk.Label(root, textvariable=stuff)
display.pack()
def get_input():
s = input("CMD: ")
stuff.set(s)
tk.Button(root, text="Get input", command=get_input).pack()
root.mainloop()
当您单击"Get input"
按钮时,将在控制台窗口中打印“CMD:”提示。输入输入后,字符串将被复制到标签。如果您在输入输入行之前再次点击按钮,Bad Things™将会发生。 :)
想出了这个:
from Tkinter import *
import random
root = Tk()
width = 800
height = 600
def key(event):
s = raw_input("CMD: ")
if s == 'quit':
root.destroy()
if s == 'l':
x1 = random.randint(0,width)
x2 = random.randint(0,width)
y1 = random.randint(0,height)
y2 = random.randint(0,height)
frame.create_line(x1,y1,x2,y2)
frame.focus_force()
frame = Canvas(root, width=width, height=height)
frame.bind("<Key>", key)
frame.pack()
frame.focus_set()
root.mainloop()
通过这种方式实在是有点,因为我必须找回焦点单击其窗口上的控制台上进入前的东西复杂化。也许从Tkinter直接读取命令然后打开设置命令参数的对话框会更好。
是的,从一个Entry小部件获取命令对于用户和程序员来说都更简单。OTOH,控制台窗口有一些很好的功能:如果你导入readline,你可以得到命令行编辑和历史记录(如果你的平台支持readline的话)。 –
在阅读关键事件后,是否有任何一种将焦点放回控制台窗口的命令? – Marco
SO不是免费的代码服务。请向我们展示您迄今为止自己解决问题所做的工作,并向我们提供[MCVE](http://stackoverflow.com/help/mcve)。 –
是的,我知道。事实上,我不想让代码回来。我只想知道是否可以接受来自控制台的输入(而不是阅读事件),并在之后更新tkinter窗口。问题是我看到很多tkinter用作输入接口的例子,而我想让控制台作为接口运行,而tkinter窗口只显示没有交互的结果。如果它是与线程有关的东西,我会更加注意这一点,但我需要一个地方开始。 – Marco
你可以做到这一点,它甚至不需要线程,但我想这没有线程有点笨重。我会很快发布一个简短的演示。 OTOH,对用户来说不是一个很好的体验,不得不在Tkinter GUI和控制台窗口之间进行切换。我想如果你强迫GUI总是在控制台窗口之上,这并不算太坏。 –