我正在尝试制作一个构建检索表单,并且似乎有按钮的问题......我是Python/tkinter GUI编程(以及一般的GUI编程)的新手,并借用了Hello World应用程序的框架,并且sorta建立了这个.
在下面的代码中,我设置了Browse按钮的"command"选项,在单击时调用我的类的内部get_dir()函数.但是,只要我尝试运行应用程序,就会调用get_dir()函数,并提示我选择一个目录.任何想法为什么会发生这种情况,以及我能做些什么才能使其表现正常?
from Tkinter import *
import tkFont
from tkFileDialog import askdirectory
class App:
def __init__(self, master):
fontHead = tkFont.Font(family="Arial", size=10, weight=tkFont.BOLD)
fontBold = tkFont.Font(family="Arial", size=8, weight=tkFont.BOLD)
fontReg = tkFont.Font(family="Arial", size=8)
frameN = Frame(master)
frameN.grid(row=0,padx=5,pady=5)
frameXBH = Frame(frameN)
frameXBH.grid(row=0,columnspan=5,padx=5)
Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=20,background="#cccccc").grid(row=0)
Label(frameXBH, text="Xbox 360",font=fontBold,width=9).grid(row=0,column=1)
Canvas(frameXBH,borderwidth=0,relief="flat",height=1,width=440,background="#cccccc").grid(row=0,column=2,sticky="WE")
Label(frameN, text="Destination Path:",font=fontReg).grid(row=1,sticky="W")
xbPath = Entry(frameN,width=30,font=fontReg)
xbPath.grid(row=1,column=1,sticky="W")
xbBrowse = Button(frameN,text="Browse...",font=fontReg,command=self.get_dir(xbPath))
xbBrowse.grid(row=1,column=2,sticky="W")
xbRel = Checkbutton(frameN,text="Release",font=fontReg)
xbRel.grid(row=1,column=3,sticky="W")
xbShip = Checkbutton(frameN,text="Ship",font=fontReg)
xbShip.grid(row=1,column=4,sticky="W")
Canvas(frameN,borderwidth=1,relief="groove",width=550,height=0).grid(row=2,columnspan=5,pady=10)
# SAVE AND CANCEL
btnSave = Button(frameN,text="Save",width=10)
btnSave.grid(row=3,column=3,sticky="E")
btnCancel = Button(frameN,text="Cancel",width=10)
btnCancel.grid(row=3,column=4,sticky="W")
def get_dir(self,box): …Run Code Online (Sandbox Code Playgroud) 如果我从终端运行以下代码,我会在终端中收到有用的错误消息:
import Tkinter as tk
master = tk.Tk()
def callback():
raise UserWarning("Exception!")
b = tk.Button(master, text="This will raise an exception", command=callback)
b.pack()
tk.mainloop()
Run Code Online (Sandbox Code Playgroud)
但是,如果我在没有终端的情况下运行它(例如,通过双击图标),则会禁止显示错误消息.
在我真实的,更复杂的Tkinter应用程序中,我喜欢GUI有点防撞击.我不喜欢我的用户很难给我有用的反馈来解决导致的意外行为.
我该怎么处理?有没有一种标准方法可以在Tkinter应用程序中公开回溯或stderror或诸如此类的东西?我正在寻找比尝试/除了各处更优雅的东西.
编辑:Jochen Ritzel给出了一个很好的答案,弹出一个警告框,并提到将它附加到一个班级.只是为了明确这一点:
import Tkinter as tk
import traceback, tkMessageBox
class App:
def __init__(self, master):
master.report_callback_exception = self.report_callback_exception
self.frame = tk.Frame(master)
self.frame.pack()
b = tk.Button(
self.frame, text="This will cause an exception",
command=self.cause_exception)
b.pack()
def cause_exception(self):
a = []
a.a = 0 #A traceback makes this easy to catch and fix
def report_callback_exception(self, *args):
err = …Run Code Online (Sandbox Code Playgroud) 如何停止处理事件或切换为其调用的函数?
修订代码:
from Tkinter import *
class GUI:
def __init__(self,root):
Window = Frame(root)
self.DrawArea = Canvas(Window)
self.DrawArea.pack()
Window.pack()
self.DrawArea.bind("<Button 1>",self.starttracking)
def updatetracking(self,event):
print event.x,event.y
def finishtracking(self,event):
self.DrawArea.bind("<Button 1>",self.starttracking)
self.DrawArea.unbind("<Motion>")
def starttracking(self,event):
print event.x,event.y
self.DrawArea.bind("<Motion>",self.updatetracking)
self.DrawArea.bind("<Button 1>",self.finishtracking)
if __name__ == '__main__':
root = Tk()
App = GUI(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud) 我在单选模式下设置了2个单独的列表框.当我从中选择一个项目时listboxA,它会突出显示,但是当我从中选择一个项目时listboxB,它会突出显示,并且该项目listboxA保持活动状态,但不会突出显示.如何突出显示两者?
我正在使用目录中的文件填充tkinter列表框.文件的名称都以01 - n中的数字开头.当我查看目录中的文件时,它们按数字顺序出现.但是,当我将文件加载到列表框中时,它们不是按数字顺序排序的.我可以更改前导数字,但相同的文件将始终出现在同一位置.
我只是使用简化的项目名称来简化这个例子.它仍然表明它们不是按字母顺序或数字顺序排序的.
该列表应在我的列表框中显示如下
01. itemA
02. itemB
03. itemC
04. itemD
Run Code Online (Sandbox Code Playgroud)
但它看起来像:
01. itemA
04. itemD
02. itemB
03. itemC
Run Code Online (Sandbox Code Playgroud)
我可以更改前导数字,但文件将始终以相同的顺序(按名称而不是数字)填充.奇怪的是,它甚至不是按字母顺序排列的.
我用过这个
i = 0
for filename in os.listdir(directory):
fileList.insert(i, filename)
i = i + 1
Run Code Online (Sandbox Code Playgroud)
还有这个
for filename in os.listdir(directory):
fileList.insert(END, filename)
Run Code Online (Sandbox Code Playgroud)
两者都导致相同的事情.
Python有Tkinter的变量类StringVar(),BooleanVar()等等,这些都共享方法get(),set(string)和trace(mode, callback).callback作为第二个参数传递的函数传递了trace(mode, callback)四个参数,self, n, m, x.
BooleanVar()这些似乎是一个例子'', 'PYVAR0', 'w'.
第三个参数x似乎是触发跟踪的模式,在我的情况下,变量已更改.但是,第一个看似空字符串的变量是什么?什么是第二个,如果我不得不猜测我会说变量的内部名称?
我收到这个错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1538, in __call__
return self.func(*args)
File "C:/Users/Marc/Documents/Programmation/Python/Llamachat/Llamachat/Llamachat.py", line 32, in download
with open(place_to_save, 'wb') as file:
PermissionError: [Errno 13] Permission denied: '/goodbye.txt'
Run Code Online (Sandbox Code Playgroud)
运行时:
def download():
# get selected line index
index = films_list.curselection()[0]
# get the line's text
selected_text = films_list.get(index)
directory = filedialog.askdirectory(parent=root,
title="Choose where to save your movie")
place_to_save = directory + '/' + selected_text
print(directory, selected_text, place_to_save)
with open(place_to_save, 'wb') as file:
connect.retrbinary('RETR ' …Run Code Online (Sandbox Code Playgroud) 不是真的相关,但我正在构建一个日历,我有很多Label小部件,因此如果我有一些边框,它会看起来更好!
我已经看到你可以为其他小部件(如Button,Entry和Text)执行此操作.
最小代码:
from tkinter import *
root = Tk()
L1 = Label(root, text="This")
L2 = Label(root, text="That")
L1.pack()
L2.pack()
Run Code Online (Sandbox Code Playgroud)
我试过设置
highlightthickness=4
highlightcolor="black"
highlightbackground="black"
borderwidth=4
Run Code Online (Sandbox Code Playgroud)
在小部件内部,但仍然是相同的结果.
这甚至可能吗?谢谢!
我在Mac上用Tkinter开发了一个python应用程序.它涉及表格和画布图纸.在Mac上,它看起来很棒.然而,在我的戴尔笔记本电脑(4K显示器,比我的Mac更强大),Tkinter ui看起来非常像素化,并且某些元素的位置略有不同.这个问题是什么,以及如何在戴尔Windows 10或其他平台上更好地渲染Tkinter?这是UI的相同部分的屏幕截图(显示表单和画布图)...
MAC(正常)
我正在创建一个用于构建人员信息的GUI.我希望用户使用下拉栏选择他们的出生月份,将之前配置的月份作为列表格式.
from tkinter import *
birth_month = [
'Jan',
'Feb',
'March',
'April'
] #etc
def click():
entered_text = entry.get()
Data = Tk()
Data.title('Data') #Title
label = Label(Data, text='Birth month select:')
label.grid(row=2, column=0, sticky=W) #Select title
Run Code Online (Sandbox Code Playgroud)
如何创建下拉列表以显示月份?