我有一个简单的Tcl脚本,它创建一个带菜单的窗口.
#! /usr/bin/tclsh
package require Tk
# Create the main message window
message .m -text {Hello Tcl!} -background white
pack .m -expand true -fill both -ipadx 100 -ipady 40
# Create the main menu bar with a Help-About entry
menu .menubar
menu .menubar.help -tearoff 0
.menubar add cascade -label Help -menu .menubar.help -underline 0
.menubar.help add command -label {About Hello ...} \
-accelerator F1 -underline 0 -command showAbout
# Define a procedure - an action for Help-About
proc showAbout {} …Run Code Online (Sandbox Code Playgroud) 我主要在Spyder工作,构建需要弹出文件夹或文件浏览窗口的脚本.
下面的代码在spyder中完美运行.在Pycharm,askopenfilename运作良好,而askdirectory什么都不做(卡住).但是,如果在调试模式下运行 - 脚本运行良好.我试图从SAS jsl运行脚本 - 同样的问题.
任何想法我该怎么办?Python 3.6 Pycharm 2017.2
谢谢.
我使用的准则包括:
import clr #pythonnet 2.3.0
import os
import tkinter as tk
from tkinter.filedialog import (askdirectory,askopenfilename)
root = tk.Tk()
root.withdraw()
PPath=askdirectory(title="Please select your installation folder location", initialdir=r"C:\Program Files\\")
t="Please select jdk file"
if os.path.exists(os.path.expanduser('~\Documents')):
FFile = askopenfilename(filetypes=(("jdk file", "*.jdk"),("All Files", "*.*")),title=t, initialdir=os.path.expanduser('~\Documents'))
else:
FFile= askopenfilename(filetypes=(("jdk file", "*.jdk"),("All Files", "*.*")),title=t)
sys.path.append(marsDllPath)
a = clr.AddReference('MatlabFunctions')
aObj = a.CreateInstance('Example.MatlabFunctions.MatLabFunctions')
Run Code Online (Sandbox Code Playgroud)
编辑:似乎与pythonnet"imoprt clr"相关的问题,但我确实在代码中需要它.
我有一个 tcl 脚本。
问题是我必须调用一个可以向 stderr 写入内容的脚本(这不是严重失败)。
我想在 tk/tcl 中分别捕获 stderr 和 stdout。
if { [catch {exec "./script.sh" << $data } result] } {
puts "$::errorInfo"
}
Run Code Online (Sandbox Code Playgroud)
此代码将返回我的结果,但它也包含 stderr。
我也想将结果传递给变量。
提前致谢...
我正在尝试在每个有一个 matplotlib 图的框架中构建一个网格。当我调整窗口大小时,图形保持固定大小并且不会调整大小以适应空白空间。有没有办法让图形根据画布改变其大小(希望它会随着窗口大小而改变)?

这就是我在每一帧中嵌入的方式:
self._figure = pyplot.figure(figsize=(4,4))
self._axes = self._figure.add_subplot(111)
self._canvas = FigureCanvasTkAgg(self._figure, master=self._root)
self._canvas.get_tk_widget().grid(row=1,column=1,rowspan = 4)
Run Code Online (Sandbox Code Playgroud) 我正在编写使用 AnyEvent 计时器的 Perl/Tk 程序。如果计时器处于活动状态,我在关闭窗口时遇到问题。我做了这个窗口关闭处理程序:
$self -> {window} -> protocol( 'WM_DELETE_WINDOW' => sub {
undef $self -> {timer};
$self -> {window} -> destroy;
});
Run Code Online (Sandbox Code Playgroud)
如果关闭窗口时计时器处于活动状态,则计时器停止,窗口关闭,但 MainLoop 不会停止。怎么了?
Tk几何管理器是否有类似pack to new line的东西?我正在使用 pack 将小部件放在框架内。在高分辨率屏幕上,小部件适合并排查找。但是,如果将其放入较小的屏幕中,则小部件将在框架中耗尽空间。
基本上,我们从:

到:
您可以看到它如何切断我的处理器输入字段。相关代码:
options_frame = ttk.LabelFrame(
parent_frame, text="Blast Options")
options_frame.pack(side=TOP, fill=X, expand=1, padx=5, pady=5)
self._set_up_blast_options(options_frame)
def _set_up_blast_options(self, options_frame):
self.evalue = Tkinter.DoubleVar()
self.evalue.set(1)
self.word_size = Tkinter.IntVar()
self.word_size.set(4)
self.penalty_mismatch = Tkinter.DoubleVar()
self.penalty_mismatch.set(-4)
self.min_d_match = Tkinter.IntVar()
self.min_d_match.set(5)
self.proc_count = Tkinter.IntVar()
self.proc_count.set(cpu_count())
# evalue
e_value_label = ttk.LabelFrame(
options_frame, text="e-Value Threshold")
e_value_entry = ttk.Entry(e_value_label)
e_value_entry.insert(0, self.evalue.get())
e_value_entry.bind('<Return>', self._validate_e_value)
e_value_entry.bind('<FocusOut>', self._validate_e_value)
e_value_label.pack(side=LEFT, expand=1, pady=5, padx=5, fill=X)
e_value_entry.pack(side=TOP, expand=1, pady=5, padx=5, fill=X)
# word size
word_size_label = ttk.LabelFrame(
options_frame, text="Word Size") …Run Code Online (Sandbox Code Playgroud) 我的目标是能够将笔记本电脑的触摸屏用作台式机的输入设备。
我理想的做法是在笔记本电脑上运行全屏 Tk 程序并接收触摸屏输入,并使用套接字将数据转发到桌面上的服务器,该服务器将使用 TWAPI 将输入转换为 Windows 事件。
不幸的是,Tk 似乎不能处理多点触控;据我所知,它将输入视为鼠标。我错了,还是事情就是这样?在 Tcl 中,此功能有什么好的选择吗?
我正在将一个程序(VMD,视觉分子动力学)移植到 Python 3.x,该程序是用 C++ 编写的,并且嵌入了 Python 和 TCL 解释器。其大部分 UI 是使用 TCL/TK 框架和 OpenGL 进行硬编码的,因此 UI 刷新是手动完成的。当 Python 解释器运行时,可以动态创建新窗口,甚至可以使用 Tkinter 将新菜单添加到主 UI。在这种情况下,所有 TK 事件都会通过定期调用 Python 端的一些代码来刷新(见下文)。这确保了所有更新都是线程安全的并且不会破坏解释器。
int PythonTextInterp::doTkUpdate() {
// Don't recursively call into dooneevent - it makes Tkinter crash for
// some infathomable reason.
if (in_tk) return 0;
if (have_tkinter) {
in_tk = 1;
int rc = evalString(
"import Tkinter\n"
"while Tkinter.tkinter.dooneevent(Tkinter.tkinter.DONT_WAIT):\n"
" pass\n"
);
in_tk = 0;
if (rc) {
return 1; // success
}
// give up …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 python/tkinter 应用程序,发现默认消息框缺乏灵活性,我使用Toplevel. 我在重新创建消息框外观方面相当成功,但是,我找不到一种方法来获取正常 tkinter 消息框中显示的图标(即:错误、警告、信息图标...)
我做了一些研究,但没有找到太多,除了这些图像存储在 win32 DLL 文件中...还尝试查看 tkinter messagebox 模块代码,但它只是一个从 python 传输到 TCL 代码的接口,我找不到(而且可能无论如何也无法阅读......)
无论如何,是否可以PhotoImage使用 python 或 TCL 执行来获取这些图标的文件或粗略等效项(对象)Tk().tk.call()?或者任何其他(然后详细解释)方法来实现这一目标?
现在我能想到的最好的解决方案是使用屏幕截图,并将图标保存到文件中,但我宁愿能够访问原始图标......
提前致谢 !
我已经实现了一个启动画面,当我的应用程序在启动时从远程云存储加载数据库时显示。启动画面通过调用 .update() 保持活动状态(上面有一个进度条),并在单独的加载过程结束后销毁。在此之后,主循环启动并且应用程序正常运行。
下面的代码曾经在我的 Mac 上使用 python 3.6 和 tcl/tk 8.5.9 运行良好。但是,在更新到 Sierra 之后,我被迫将 tk 更新到 ActiveTcl 8.5.18。现在,在单独的进程完成之前不会显示启动画面,但随后会与根窗口一起出现并停留在屏幕上(即使调用了它的 .destroy() 方法)。
import tkinter as tk
import tkinter.ttk as ttk
import multiprocessing
import time
class SplashScreen(tk.Toplevel):
def __init__(self, root):
tk.Toplevel.__init__(self, root)
self.geometry('375x375')
self.overrideredirect(True)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.label = ttk.Label(self, text='My Splashscreen', anchor='center')
self.label.grid(column=0, row=0, sticky='nswe')
self.center_splash_screen()
print('initialized splash')
def center_splash_screen(self):
w = self.winfo_screenwidth()
h = self.winfo_screenheight()
x = w / 2 - 375 / 2
y = h / 2 - …Run Code Online (Sandbox Code Playgroud) tk-toolkit ×10
python ×6
tkinter ×5
tcl ×3
python-3.x ×2
.net ×1
anyevent ×1
c++ ×1
matplotlib ×1
menu ×1
multi-touch ×1
perl ×1
python.net ×1
scripting ×1
ttk ×1
ubuntu ×1
ubuntu-unity ×1