2016-09-25 119 views
-1

我阅读了一些关于tkinter的教程(基本),并学习了如何创建一个主循环并为其添加gui元素。还学会了如何将操作绑定到按钮小部件。现在在命令行上绘制tkinter画布

我想做到这一点:

  1. 推出Tkinter的帆布
  2. 能够将这些命令后,从控制台读取命令和更新画布。

例如: 谨在控制台上的参数和某些图形元素命令被添加到画布(和画布后更新)。

是可能的事情,也许threading有关? 你能否指出我认为最合理的一个方向?

+0

SO不是免费的代码服务。请向我们展示您迄今为止自己解决问题所做的工作,并向我们提供[MCVE](http://stackoverflow.com/help/mcve)。 –

+0

是的,我知道。事实上,我不想让代码回来。我只想知道是否可以接受来自控制台的输入(而不是阅读事件),并在之后更新tkinter窗口。问题是我看到很多tkinter用作输入接口的例子,而我想让控制台作为接口运行,而tkinter窗口只显示没有交互的结果。如果它是与线程有关的东西,我会更加注意这一点,但我需要一个地方开始。 – Marco

+0

你可以做到这一点,它甚至不需要线程,但我想这没有线程有点笨重。我会很快发布一个简短的演示。 OTOH,对用户来说不是一个很好的体验,不得不在Tkinter GUI和控制台窗口之间进行切换。我想如果你强迫GUI总是在控制台窗口之上,这并不算太坏。 –

回答

0

下面是通过标准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™将会发生。 :)

0

想出了这个:

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直接读取命令然后打开设置命令参数的对话框会更好。

+0

是的,从一个Entry小部件获取命令对于用户和程序员来说都更简单。OTOH,控制台窗口有一些很好的功能:如果你导入readline,你可以得到命令行编辑和历史记录(如果你的平台支持readline的话)。 –

+0

在阅读关键事件后,是否有任何一种将焦点放回控制台窗口的命令? – Marco