小编JDM*_*JDM的帖子

是否有针对Tkinter /网格几何体的GUI设计应用程序?

有没有人知道一个GUI设计应用程序,它允许您选择/拖放小部件,然后使用grid几何管理器使用适当的Tkinter调用和排列将该布局转换为Python代码?到目前为止,我已经找到了一些我可能最终使用的相当不错的选项,但是它们使用packplace代替生成代码.

在您说出来之前:是的,我知道Tkinter很容易学习,是的,我找到了多个在线资源来帮助我这样做,而且我已经开始了.这不是关于避免学习的努力,而是关于使用正确的工具来完成工作.我很久以前就发现那些用于编码程序逻辑的拖放小部件环境,当项目超出一定的大小时,它们太笨拙且无法管理 - 对于更大的东西,它更容易构建和维护逻辑当它是纯文本.最近我发现设计GUI的反面也是如此.编写文本可以达到某种程度,但是当你有一个包含30或40个小部件的主窗口,再加上几个具有相似复杂性的侧窗时,如果你可以用图形方式设计它而不是全部输入它,它会更快更容易.

python grid tkinter

48
推荐指数
3
解决办法
12万
查看次数

对于ttk Treeview小部件,不会激活水平滚动

我正在使用ttk Treeview小部件来实现文件夹/路径选择对话框.除了我的水平滚动条不会激活外,它都按预期工作.无论文件夹路径横向有多宽,无论窗口有多窄,都不会出现水平滑块.垂直滚动工作正常.

当你在树视图中只使用一列时,或者只是在配置和连接小部件时出现新手错误时,我认为它要么是某种限制.我打赌后者.

扩展对话框以显示完整文件夹深度的示例:

全屏宽度

对话框缩小到水平滚动应该激活的程度(但不是):

宽度变窄

这是我的GUI布局代码:

winDirSel = tk.Toplevel()
winDirSel.title('Select Test Directory...')
tvwDirSel = ttk.Treeview(winDirSel,
                         height=10,padding=3,
                         show='tree')
lblTestDir = tk.Label(winDirSel, relief=tk.SUNKEN,
                      justify=tk.LEFT, anchor=tk.W,
                      textvariable=ctrlTestDir,width=80)
scbHDirSel = ttk.Scrollbar(winDirSel,
                           orient=tk.HORIZONTAL,
                           command=tvwDirSel.xview)
scbVDirSel = ttk.Scrollbar(winDirSel,
                           orient=tk.VERTICAL,
                           command=tvwDirSel.yview)
tvwDirSel.configure(xscrollcommand=scbHDirSel.set,
                    yscrollcommand=scbVDirSel.set)
lblTestDir.grid(row=0,column=0,sticky=tk.EW)
tvwDirSel.grid(row=1,column=0,sticky=tk.NSEW)
scbVDirSel.grid(row=1,column=1,sticky=tk.NS)
scbHDirSel.grid(row=2,column=0,sticky=tk.EW)
winDirSel.rowconfigure(1,weight=1)
winDirSel.columnconfigure(0,weight=1)
Run Code Online (Sandbox Code Playgroud)

treeview tkinter scrollbar ttk python-2.7

10
推荐指数
1
解决办法
7702
查看次数

Python bool()函数可以为无效参数引发异常吗?

有可能为类似功能int()float()引发异常(ValueError)如果参数不能被转换为适当的数字类型.因此,try-except如果有可能将无效的参数传递给它们,通常将这些包含在a中是一种好的做法.

但是,当涉及到"真实性"时,Python的灵活性,我无法想到你可能传递给bool()会引发异常的函数的任何可能的值.即使你完全没有参数调用它,该函数也会完成并返回False.

我是否正确,bool()只要你传递的不超过一个参数,就不会引发异常?结果,将呼叫包含在一个try-except?中是没有意义的?

python boolean exception-handling

7
推荐指数
1
解决办法
362
查看次数

Win7上的Tkinter highlightcolor选项

我正在构建一个Tkinter GUI(Python 2.7)并在Win7机器上运行它.我想做的其中一件事就是按钮和复选框等控件在突出显示时采用不同的颜色(因为高亮标记本身有点模糊,特别是默认的灰色背景).但是,设置highlightcolor为不同的颜色(例如'cyan')对GUI没有任何影响; 无论是否有焦点,控件都保持灰色.作为交叉检查,我尝试将所有highlightblah选项设置为不同的选项,但仍显示为灰色,厚度也没有明显变化.

这仅仅是Win7上Tkinter的限制吗?它只是不回应这些选项吗?

tkinter windows-7 python-2.7

6
推荐指数
1
解决办法
969
查看次数

使用 UTF-8 字符串写入文件期间出现 Python 编解码器错误

我正在开发一个 Python 3 Tkinter 应用程序(操作系统是 Windows 10),其整体功能包括以下详细信息:

  1. 读取多个可能包含 ascii、cp1252、utf-8 或任何其他编码数据的文本文件

  2. 在“预览窗口”(Tkinter 标签小部件)中显示任何这些文件的内容。

  3. 将文件内容写入单个输出文件(每次打开以追加)

对于#1:我只需通过以二进制模式打开和读取文件,即可使文件读取与编码无关。为了将数据转换为字符串,我使用一个循环,该循环遍历“可能”的编码列表,并依次尝试其中的每一个(使用error='strict'),直到遇到不引发异常的编码。这是有效的。

对于#2:一旦获得解码后的字符串,我只需调用set()Tkinter Label 的textvariable. 这也正在发挥作用。

对于#3:我以通常的方式打开一个输出文件并调用该write()方法来写入解码的字符串。当字符串被解码为 ascii 或 cp1252 时,这是有效的,但当它被解码为 utf-8 时,它会抛出异常:

'charmap' codec can't encode characters in position 0-3: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

我四处搜索并发现了相当相似的问题,但似乎没有任何内容可以解决这个特定问题。一些进一步的复杂性限制了对我有用的解决方案:

答:我可以通过将读入数据保留为字节并以二进制形式打开/写入输出文件来回避问题,但这会导致某些输入文件内容不可读。

B. 虽然这个应用程序主要针对 Python 3,但我正在努力使其与 Python 2 交叉兼容——我们有一些缓慢/较晚的采用者将使用它。(顺便说一句,当我在 Python 2 上运行该应用程序时,它也会引发异常,但对于 cp1252 数据和 utf-8 数据都会引发异常。)


为了说明问题,我创建了这个精简的测试脚本。(我真正的应用程序是一个更大的项目,而且它也是我公司专有的 - 所以它不会公开发布!)

import tkinter as tk
import codecs

#Root window
root = tk.Tk()

#Widgets
ctrlViewFile1 = tk.StringVar()
ctrlViewFile2 …
Run Code Online (Sandbox Code Playgroud)

python utf-8 file-writing python-2.7 python-3.x

5
推荐指数
1
解决办法
8297
查看次数

没有写权限时,Python tempfile.TemporaryFile 在 Windows 上挂起

我的环境是 Python 3.7.2,在 Windows 10 上运行。我正在研究目录选择小部件,我正在寻找最干净+最可靠的方法来测试所选目录路径是否允许写入权限。

以前我一直用通常的open()方法打开一个命名文件,向它写入几个字节,然后删除它——把整个东西放在一个try-except块中。这没关系,但它冒着留下不需要的文件的风险。最近我遇到了 的文档tempfile.TemporaryFile(),这似乎是获得相同结果的更简洁的方法,而且没有在系统上留下垃圾文件的风险。

问题是,tempfile.TemporaryFile()当它给出dir一个只读文件夹的参数时,它会挂在我的系统上。我在谷歌上搜索并发现了这个非常古老的错误,但它是针对 Python 2.4 编写的,并且很久以前就已修复。

这是我放在一起来说明问题的测试脚本。(请注意,我省略了实际应用程序执行的文件删除,因为它与插图无关。)

import os, tempfile

def normOpen(checkPath):
    try:
        with open(os.path.join(checkPath,'x.txt'),'wb') as tf:
            tf.write(b'ABC')
    except Exception as e:
        print('Write disabled for '+checkPath)
        print(str(e))
    else:
        print('Write enabled  for '+checkPath)

def tfOpen(checkPath):
    try:
        with tempfile.TemporaryFile(dir=checkPath) as tf:
            tf.write(b'ABC')
    except Exception as e:
        print('Write disabled for '+checkPath)
        print(str(e))
    else:
        print('Write enabled  for '+checkPath)

tryPath1 = 'C:\\JDM\\Dev_Python\\TMPV\\canwrite'  #Full control path
tryPath2 = …
Run Code Online (Sandbox Code Playgroud)

windows temporary-files python-3.x

5
推荐指数
1
解决办法
1781
查看次数

Python Tkinter网格几何粘滞设置无效(?)

我正在使用grid几何体在Python/Tkinter中设计简单的输入对话框,并获得一些意想不到的行为.当我开始使用此代码时:

winAddNew = tk.Toplevel()
winAddNew.title('Add New Customer')
lblName = tk.Label(winAddNew,
                   anchor=tk.W,font=fntNormal,
                   text='Enter the complete name of the customer:')
entName = tk.Entry(winAddNew,
                   justify=tk.LEFT, font=fntNormal, width=20,
                   textvariable=ctrlNewCustomerName)
lblID = tk.Label(winAddNew,
                 anchor=tk.W,font=fntNormal,
                 text='Enter a unique three-character ID:')
entID = tk.Entry(winAddNew,
                 justify=tk.LEFT, font=fntNormal, width=8,
                 textvariable=ctrlNewCustomerID)
lblName.grid(row=0,column=0,columnspan=2,sticky=tk.W,padx=10,pady=(10,0))
entName.grid(row=1,column=0,columnspan=2,sticky=tk.W,padx=10,pady=(5,0))
lblID.grid(row=2,column=0,sticky=tk.W,padx=(10,0),pady=10)
entID.grid(row=2,column=1,sticky=tk.W,padx=(0,10),pady=10)
Run Code Online (Sandbox Code Playgroud)

...这就是渲染窗口在我的机器上的外观(Windows 7,Python 2.7.3).请注意,绿线实际上并不存在,我只是使用它们来布置我认为应该是行和列的位置.

在此输入图像描述

到现在为止还挺好.现在我想设置widthentName高达60,给更多的可视空间,输入客户名称.因为我有它的columnspan设置2,并且因为每个小部件都是tk.Wsticky选项设置的,所以我期望增加宽度entName除了扩大条目小部件本身以及相应地扩大窗口之外没有任何效果.所有其他小部件相对于彼此的位置应保持不变 - 对吗?

不.扩大entName也导致entID被推离lblID:

在此输入图像描述

那我错过了什么?为什么不entID留在原地?是否有某种方法可以让它保持原位,除了阻止第2排进入自己的框架?

python tkinter python-2.7

4
推荐指数
1
解决办法
5298
查看次数

使用CSV阅读器上的list()函数不一致

在研究一个常见问题(如何在迭代之前找到CSV阅读器中的行数)的选项时,我遇到了使用的方法len(list(myCSVReader)).是的,我知道这是多么笨重和潜在的昂贵,我将不会使用它.但在玩它时,我遇到了一个非常令人费解的不一致:

#myFile.txt is a 3-line CSV file
myCSV = csv.reader(open('myFile.txt','rb'),dialect='excel')
print(len(list(myCSV)))
print(list(myCSV))
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

> 3
> []
Run Code Online (Sandbox Code Playgroud)

我可以理解为什么你不能只使用list()将阅读器转换为列表列表,但如果是这种情况,那么如何/为什么会len()产生正确的结果呢?

- JDM

python python-2.7

3
推荐指数
1
解决办法
190
查看次数

可以将字典键强制为特定顺序吗?

我知道通常字典中键/值的顺序是任意的.但是,如果您声明字典"longhand"(见下文)然后从不添加或删除任何键,这是否意味着密钥顺序将在您声明时保留?

我做了几个简短的实验,答案似乎是肯定的,但在我依靠这个之前,我想确定一下.

当我说"手写"时,我只是指一个明确的每个键和值的声明:

myDict = {key1: val1, key2: val2, key3: val3, .... }
Run Code Online (Sandbox Code Playgroud)

python dictionary python-2.7

1
推荐指数
1
解决办法
164
查看次数

创建一个没有X(关闭)按钮的python tkinter窗口

我正在编写一个'向导'类型的Python Tkinter GUI,它从用户收集信息,然后根据用户的条目执行多个操作:文件复制,数据库更新等.处理通常需要30-60秒,在此期间,我想要:

  1. 为用户提供有关活动和进度的文本更新
  2. 阻止用户关闭应用程序,直到它完成它正在做的事情

我开始将文本更新显示在子窗口中,该子窗口被配置为trainsientwait_window用于暂停主循环直到活动完成.这适用于我创建的其他自定义对话框,它们具有调用窗口destroy方法的OK/cancel按钮.基本方法是:

def myCustomDialog(parent,*args):
    winCDLG = _cdlgWin(parent,*args)
    winCDLG.showWin()
    winCDLG.dlgWin.focus_set()
    winCDLG.dlgWin.grab_set()
    winCDLG.dlgWin.transient(parent)
    winCDLG.dlgWin.wait_window(winCDLG.dlgWin)
    return winCDLG.userResponse

class _cdlgWin():
    def __init__(self,parent,*args):
        self.parent = parent
        self.dlgWin = tk.Toplevel()
        self.userResponse = ''

    def showWin(self):
        #Tkinter widgets and geometry defined here

    def _btnOKClick(self):
        #self.userResponse assigned from user entry/entries on dialog
        self.dlgWin.destroy()

    def _btnCancelClick(self):
        self.dlgWin.destroy()
Run Code Online (Sandbox Code Playgroud)

但是,这种方法不适用于我想要创建的新监视器和更新对话框.

首先,因为没有用户启动的操作来触发复制/更新活动然后destroy,我必须将它们放在showWin或其他方法中.我已经尝试了两种方式但是我遇到了竞争条件(代码完成了复制/更新的东西,但之后尝试在它之前销毁窗口),并且从不执​​行复制/更新的东西,因为它点击wait_window之前我可以激活其他方法.

如果我能找到一种方法,那么次要问题(防止用户在工作完成之前关闭子窗口)将在下面的答案中介绍.

那么......有什么样的绑带可以申请让这种方法按我想要的方式工作吗?或者我需要废弃它,因为它无法正常工作?(如果是后者,有什么方法可以实现最初的目标吗?)

python windows tkinter windows-7 python-2.7

0
推荐指数
1
解决办法
8820
查看次数