有没有办法在不知道小部件的字体系列和字体大小的情况下更改Tkinter小部件的字体样式?
使用案例:我们使用标准Tkinter小部件(标签,条目,文本等)创建UI .在我们的应用程序运行时,我们可能希望使用该.config()方法动态地将这些小部件的字体样式更改为粗体和/或斜体.遗憾的是,如果没有指定字体的族和大小,似乎无法指定字体规范.
以下是我们想要做的事情的例子,但这些例子都不起作用:
widget.config(font='bold')
Run Code Online (Sandbox Code Playgroud)
要么
widget.config(font=( None, None, 'bold' ))
Run Code Online (Sandbox Code Playgroud) 我有一个小的GUI测试,带有"开始"按钮和进度条.期望的行为是:
观察到的行为是"开始"按钮冻结5秒钟,然后显示进度条(无振荡).
到目前为止,这是我的代码:
class GUI:
def __init__(self, master):
self.master = master
self.test_button = Button(self.master, command=self.tb_click)
self.test_button.configure(
text="Start", background="Grey",
padx=50
)
self.test_button.pack(side=TOP)
def progress(self):
self.prog_bar = ttk.Progressbar(
self.master, orient="horizontal",
length=200, mode="indeterminate"
)
self.prog_bar.pack(side=TOP)
def tb_click(self):
self.progress()
self.prog_bar.start()
# Simulate long running process
t = threading.Thread(target=time.sleep, args=(5,))
t.start()
t.join()
self.prog_bar.stop()
root = Tk()
root.title("Test Button")
main_ui = GUI(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
基于从布赖恩奥克利的信息在这里,我明白,我需要使用线程.我尝试创建一个线程,但我猜测,因为线程是从主线程中启动的,所以没有用.
我有想法放置在不同的类中的逻辑部分,以及从该类,类似于由A.罗达斯示例代码内实例化GUI 这里.
我的问题:
我无法弄清楚如何编码它,以便这个命令:
self.test_button = Button(self.master, command=self.tb_click)
Run Code Online (Sandbox Code Playgroud)
调用位于另一个类中的函数.这是一件坏事还是可能?我如何创建一个可以处理self.tb_click的第二类?我试着跟随A. Rodas的示例代码,它的工作非常精彩.但是我无法弄清楚如何在触发动作的Button小部件的情况下实现他的解决方案.
如果我应该在单个GUI类中处理线程,那么如何创建一个不干扰主线程的线程呢?
我正在用Tkinter编写幻灯片程序,但我不知道如何将背景颜色更改为黑色而不是标准浅灰色.如何才能做到这一点?
import os, sys
import Tkinter
import Image, ImageTk
import time
root = Tkinter.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(1)
root.geometry("%dx%d+0+0" % (w, h))
root.focus_set()
root.bind("<Escape>", lambda e: e.widget.quit())
image = Image.open(image_path+f)
tkpi = ImageTk.PhotoImage(image)
label_image = Tkinter.Label(root, image=tkpi)
label_image.place(x=0,y=0,width=w,height=h)
root.mainloop(0)
Run Code Online (Sandbox Code Playgroud) 在Tkinter 中有多种方法可以获得回调Text或者Entry更改小部件,但是我没有找到一个用于回调的方法Listbox(我找不到的大部分事件文档是旧的还是不完整的).有没有办法为此生成一个事件?
当我使用以下方式绘制形状时:
canvas.create_rectangle(10, 10, 50, 50, color="green")
Run Code Online (Sandbox Code Playgroud)
Tkinter是否记录了它的创建事实?
在我正在制作的一个简单游戏中,我的代码有一个Frame创建一堆矩形,然后绘制一个大的黑色矩形来清除屏幕,然后绘制另一组更新的矩形,依此类推.
我在内存中创建了数千个矩形对象吗?
我知道你可以将上面的代码分配给一个变量,但如果我不这样做,只是直接绘制到画布,它是否留在内存中,还是只是绘制像素,就像在HTML5画布中一样?
通过 pyenv 安装的 Python 版本无法导入tkinter:
? python
Python 3.8.1 (default, Feb 29 2020, 11:45:59)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
>>>
Run Code Online (Sandbox Code Playgroud)
或者您可能会收到有关标头版本与二进制文件不匹配的消息:
DEPRECATION WARNING: The system version of Tk is deprecated …Run Code Online (Sandbox Code Playgroud) 我有一点使用Python开发小型命令行应用程序的经验.我想继续用Python开发GUI.从Python的可用GUI工具包中,我认为最喜欢的是wxPython和Tkinter ; 但我不想一直自己编写所有的GUI代码.
这些工具包中是否有任何好的GUI IDE?它不需要是免费的或开源的.
每个tkinter教程我都看到了tkinter.mainloop必须要求绘制窗口和要处理的事件的声明,并且它们总是调用此函数,即使在hello world程序中也是如此.但是,当我在交互式shell中尝试这些时,无需调用mainloop即可正确绘制窗口. 这个在tkinter中嵌入matplotlib图形的例子产生了一个相对复杂的应用程序,带有用于在tkinter窗口内平移,缩放和调整绘图大小的按钮,再次,如果你删除对mainloop的调用并在交互式shell中运行代码,这一切都有效. .当然,如果我在交互式shell之外运行脚本(删除了mainloop),程序结束得太快就看不到会发生什么,但如果我添加一个调用input 保持程序打开一切正常(我在Linux上运行python 3.2.2).
那么mainloop到底做了什么,什么时候需要调用呢?
编辑:澄清一下,如果我打开GNOME终端并输入
$python3
>>> import tkinter
>>> root = tkinter.Tk()
Run Code Online (Sandbox Code Playgroud)
一个窗口立即出现,而不必调用mainloop,更复杂的tkinter功能似乎也可以工作(例如,向窗口添加按钮).在IDLE中,需要调用mainloop.我的理解是,在调用mainloop之前,不应绘制任何内容,也不应处理任何事件.
我正在尝试使用Tkinter创建一个按钮网格(以实现可点击的单元格效果).
我的主要问题是我无法使grid按钮自动调整并适合父窗口.
例如,当我在网格上有大量按钮时,而不是缩小按钮以使网格适合窗口内部,我得到一个离开屏幕的拉伸框架.
我正在寻找的效果是网格填充所有可用空间,然后调整其单元格以适应该空间.我已阅读文档,但我仍然无法弄清楚如何使其工作.
这是基本代码,这是我的出发点:
def __init__(self):
root = Tk()
frame = Frame(root)
frame.grid()
#some widgets get added in the first 6 rows of the frame's grid
#initialize grid
grid = Frame(frame)
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2)
#example values
for x in range(60):
for y in range(30):
btn = Button(grid)
btn.grid(column=x, row=y)
root.mainloop()
Run Code Online (Sandbox Code Playgroud) python ×10
tkinter ×10
autoresize ×1
button ×1
event-loop ×1
events ×1
fonts ×1
grid ×1
ide ×1
macos ×1
progress-bar ×1
pyenv ×1
python-3.x ×1
tk-toolkit ×1
wxpython ×1