与其他在Perl中创建GUI的解决方案相比,Tk模块有哪些缺点?
我有一个使用pyplot(backend:tkagg)的python程序,其中简单地创建了一个带有一些东西的matplotlib.当我想退出程序时,我立即致电:
plt.close('all')
Run Code Online (Sandbox Code Playgroud)
关闭它.奇怪的是,程序dosnt退出.
在调试器之后,我看到在完成任务后,它返回到
class Show(ShowBase):
def mainloop(self):
Tk.mainloop()
Run Code Online (Sandbox Code Playgroud)
在backend_tkagg.py中,
其次是
if not is_interactive():
self.mainloop()
Run Code Online (Sandbox Code Playgroud)
在同一个文件中,然后到
def show(*args, **kw):
global _show
_show(*args, **kw)
Run Code Online (Sandbox Code Playgroud)
在pyplot.py 所以看来我仍然在pyplot循环中!
如何正确退出?
谢谢...
我已经广泛阅读了这个问题,但没有找到可用的解决方案.他们中的许多人建议从头开始重建python.如果可能的话,这是我想避免的障碍.因此,我将最后一次提出这个问题,绝望的射击.它不应该与stackoverflow上的许多类似问题重复,因为我认为它特定于我的安装,即使症状与其他类似.
这是我安装的当前状态.我已经安装了许多其他软件包numpy,有matplotlib没有问题,但这个问题让我感到困惑.
MacBookPro:lib-tk rebcabin$ arch -x86_64 /opt/local/bin/python
Python 2.7.3 (default, Nov 17 2012, 19:54:34)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', ...
'/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
...]
Run Code Online (Sandbox Code Playgroud)
注意lib-tk路径.我们来看看lib-tk:
MacBookPro:lib-tk rebcabin$ ls -la
total 3704
...
-rw-r--r-- 1 root wheel 155634 Nov 17 19:55 Tkinter.py
-rw-r--r-- 1 root wheel 224887 Nov 17 19:55 Tkinter.pyc
-rw-r--r-- 1 root wheel 224887 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用该tcltk包为R创建脚本小部件.但我不知道如何创建一个STOP按钮来中断来自小部件的脚本.基本上,我想有一个按钮,一个菜单选项,和/或一个会中断当前脚本执行的键绑定,但我无法弄清楚如何让它工作.
一个(非理想的)策略是只使用RGui STOP按钮(<ESC>或<Ctrl-c>在控制台上),但这似乎会导致tk小部件永久挂起.
这是基于tcl/tk示例(http://bioinf.wehi.edu.au/~wettenhall/RTclTkExamples/evalRcode.html)的小部件的最小示例:
require(tcltk)
tkscript <- function() {
tt <- tktoplevel()
txt <- tktext(tt, height=10)
tkpack(txt)
run <- function() {
code <- tclvalue(tkget(txt,"0.0","end"))
e <- try(parse(text=code))
if (inherits(e, "try-error")) {
tkmessageBox(message="Syntax error", icon="error")
return()
}
print(eval(e))
}
tkbind(txt,"<Control-r>",run)
}
tkscript()
Run Code Online (Sandbox Code Playgroud)
在脚本小部件中,如果您尝试执行Sys.sleep(20)然后从控制台中断,则小部件将挂起.如果要运行一个相同的事情,例如,无限循环,就像while(TRUE) 2+2.
我认为我所遇到的可能类似于此处报告的错误:https://bugs.r-project.org/bugzilla3/show_bug.cgi?id = 14730
另外,我应该提一下,我在Windows(x64)上的R 3.0.0上运行它,所以问题可能是特定于平台的.
有关如何在不导致小部件挂起的情况下中断正在运行的脚本的任何想法?
我有一个使用Tk的perl程序.有没有选择创建一个perl脚本的"析构函数"?我的意思是例如我想在主窗口关闭之前关闭数据库并杀死子进程.
我在tkinter python中编写了一个hello world应用程序,但我收到了下一条消息:'module'对象没有属性'Frame'
import _tkinter as tk
Run Code Online (Sandbox Code Playgroud)
这是错误
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.hi_there = tk.Button(self)
self.hi_there["text"] = "Hello World\n(click me)"
self.hi_there["command"] = self.say_hi
self.hi_there.pack(side="top")
self.QUIT = tk.Button(self, text="QUIT", fg="red",
command=root.destroy)
self.QUIT.pack(side="bottom")
def say_hi(self):
print("hi there, everyone!")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我想知道,我如何制作一个Tkinter(在Python中)菜单,该菜单以参数为目标,例如foo("what")?
def foo(arg):
print "Foo, %s." % arg
popup = Menu()
popup.add_command(label="Spam!", command=foo("spam")) # Doesn't work.
popup.add_command(label="Turkey!", command=foo("turkey")) # Doesn't work.
popup.post(50, 50)
Run Code Online (Sandbox Code Playgroud) 我正在研究一个带有适当GUI的自编模拟工具.通常,有两种主要的用户模式.在第一个中,用户可以输入多个值以进行所需的计算.在所有计算完成后,用户可以通过单击右下角的"显示结果"按钮切换到"结果模式".通过这样做,GUI上部带有图像的主窗口不会改变.但是,GUI下部的前一个输入条目应该更改为消息区域,其中显示错误,警告或其他信息(持续时间,收敛性......).
我能够使两种GUI模式都可切换,但是下框架(称为框架lowerframe)的框架高度发生了变化,看起来非常难看.
我认为所描述的行为是帧内容的不同高度的结果.在第一模式中有几个entry小部件,而在第二模式中只有一个小小label部件包含foo.
如何防止框架高度动态变化?换句话说:有没有办法来修复高度lowerframe?
我指定height=200(以及btnframe在GUI的右下角),这似乎没有任何效果,因为包含foo-label小部件的框架肯定小于那些200像素.
--- MWE ---
#!/usr/bin/env python3
# coding: utf-8
from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.parameternames = []
# create master window
self.master = master
# create master window
self.create_masterwindow()
def create_masterwindow(self):
"""
creates master window with menubar and sets GUI to input mode
"""
self.master.title('GUI') …Run Code Online (Sandbox Code Playgroud) 不能tkinter.widget.configure(text="our text")用于所有小部件?使用的优点或主要目的是什么:
var_cls = tkinter.StringVar()
tkinter.widget.configure(textvariable=var_cls)
Run Code Online (Sandbox Code Playgroud)
它是否var_cls可以更容易地在方法/类之间共享?
Variable类的示例:
import tkinter as tk
root = tk.Tk()
var = tk.StringVar(value="This will be on the label.")
tk.Label(root, textvariable=var).pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
没有Variable类的示例:
import tkinter as tk
root = tk.Tk()
tk.Label(root, text="This will be on the label.").pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud) 我想使用Perl来读取模块Tcl::pTk
链接到的Tcl版本
.我发现以下哪个工作正常
use strict;
use warnings;
use Tcl::pTk;
my $int = new Tcl::pTk;
$int->Eval(<<'EOS');
# pure-tcl code to create widgets (e.g. generated by some GUI builder)
text .e
## http://wiki.tcl.tk/1626#tk_version
.e insert end "tcl_version $tcl_version\n"
.e insert end "tcl_patchLevel $tcl_patchLevel\n"
.e insert end "tk_version $tk_version\n"
.e insert end "tk_patchLevel $tk_patchLevel\n"
.e insert end "tk_library $tk_library\n"
pack .e
EOS
my $e = $int->widget('.e'); # get .e entry into play
$int->MainLoop;
Run Code Online (Sandbox Code Playgroud)
这会在GUI中显示值,但我想$tcl_version在脚本的其他部分使用.在这我失败了,$tcl_version似乎不存在.我不需要GUI部分,只需要标量的值.
tk-toolkit ×10
python ×6
tkinter ×6
perl ×3
tcl ×3
command ×1
macos ×1
matplotlib ×1
python-3.x ×1
r ×1
widget ×1