Python Tkinter:有没有一种方法可以防止“标签”文本将列推到一边?

时间:2020-03-05 20:12:12

标签: python python-3.x tkinter

我对Python的Tkinter库工具非常陌生。目前,我正在尝试在用户向服务器节点输入正确的登录凭据时在屏幕上输出文本。在此GUI周围组织事物时,我使用的是grid而不是pack

是否可以防止Label文本将列推到一边?


这是当前GUI的外观:

enter image description here

...,这是当我在屏幕上显示一些确认文本时“登录”服务器节点时发生的情况:

enter image description here

...这就是我希望发生的事情(照片购物):

enter image description here

...并使用@Bryan Oakley的反馈(差异很小):

enter image description here

我可以将文本移到第二列column=1上,但是在文本框输入模块的右边有一些内容(我不会在此问题中显示)。我最初以为,GUI可能有一些层优先级,所以也许我可以将文本设置在最底层,这样就不会影响文本框,但是我没有在Tkinter's official documentation上找到任何有关此操作的信息


这是我的一些代码:

import json
import requests
import sys
import os
import time
import threading
import getpass
import warnings
from tkinter import *
from tkinter import ttk

nodeIPLabel = Label(text = 'Node IP/Hostname :   ')
nodeIPLabel.grid(column = 0, row = 0, sticky='W')
nodeUsernameLabel = Label(text = 'Node username :   ')
nodeUsernameLabel.grid(column = 0, row = 1, sticky='W')
nodePasswordLabel = Label(text = 'Node passwword :   ')
nodePasswordLabel.grid(column = 0, row = 2, sticky='W')

# Enter Login Credentials
nodeIP = StringVar()
nodeUsername = StringVar()
nodePassword = StringVar()

nodeIPEntry = Entry(textvariable = nodeIP, width = 30)
nodeIPEntry.grid(column = 1, row = 0, sticky='W')
nodeUsernameEntry = Entry(textvariable = nodeUsername, width = 30)
nodeUsernameEntry.grid(column = 1, row = 1, sticky='W')
nodePasswordEntry = Entry(textvariable = nodePassword, width = 30, show = '*')
nodePasswordEntry.grid(column = 1, row = 2, sticky='W')

def nodeLogin():
    global nodeIP
    nodeIP = nodeIP.get()
    global nodeUsername
    nodeUsername = nodeUsername.get()
    global nodePassword
    nodePassword = nodePassword.get()
    global nodeType
    nodeType = nodeType.get()
    nodeURL = 'https://' + nodeIP

    try:
        listOfStuff = '%s/redfish/v1/Chassis/1' % nodeURL
        response = requests.get(listOfStuff, auth=(nodeUsername, nodePassword), verify=False)
        if response.status_code == 200:
            print('Connection successful!')
    except requests.exceptions.ConnectionError:
       connectionStatus = Label(text='Connection failure: Incorrect or nonexisting IP/Hostname. Hit "RESET GUI" to restart.', fg = 'red')
       connectionStatus.grid(column = 0, row = 7, sticky='N')

    except requests.exceptions.InvalidURL:
        connectionStatus = Label(text='Connection failure: Nothing was typed in. Hit "RESET GUI" to restart.', fg = 'red')
        connectionStatus.grid(column = 0, row = 7, sticky='N')

    except KeyError:
        connectionStatus = Label(text='Connection failure: Wrong login credentials. Hit "RESET GUI" to restart.', fg = 'red')
        connectionStatus.grid(column = 0, row = 7, sticky='N')

    except json.decoder.JSONDecodeError:
        connectionStatus = Label(text='Connection failure: Unknown error... Hit "RESET GUI" to restart.', fg = 'red')
        connectionStatus.grid(column = 0, row = 7, sticky='N')

def resetGUI():
    os.startfile(__file__)
    sys.exit()

# Login button
nodeLoginButton = Button(text = 'LOGIN', command = nodeLogin, bg = 'green', width = 20)
nodeLoginButton.grid(column = 0, row = 4, sticky='W')

# Reset script button
resetButton = Button(text = 'RESET GUI', command = resetGUI, bg = 'yellow', width = 20)
resetButton.grid(column = 0, row = 5, sticky = 'W')

# Stop script button
stopButton = Button(text = 'EMERGENCY STOP', command = window.destroy, bg = 'red', width = 20)
stopButton.grid(column = 0, row = 6, sticky = 'W')

window.mainloop()            

1 个答案:

答案 0 :(得分:1)

在这种情况下,最简单的解决方案是让底部标签跨越多列。

connectionStatus.grid(column = 0, row = 7, sticky='N', columnspan=2)

当然,这假定您仅使用2列。如果您使用的更多,请调整columnspan以适合您的总体设计。

但是,即使文字太长而无法容纳在窗口中,这还是不够的。在这种情况下,您需要为小部件提供固定大小。当您这样做时,标签的内容不会导致标签更改大小。

通常,我对这样的窗口小部件执行的操作是将其大小设置为1,使标签跨越您正在使用的所有列,然后使用sticky属性使窗口小部件“粘贴”到分配给它的空间的侧面。这将使标签增大以适应空间,但是由于您已经给出了明确的请求尺寸,因此更改文本不会更改标签的尺寸。

话虽这么说,一种更简单的方法是将窗口分为两部分:顶部是带有所有小部件的框架,底部是仅带有标签的框架。然后,您可以使用pack轻松地排列顶部和底部,然后可以使用grid在框架中布置小部件,但是由于标签在框架之外,因此不会影响任何东西。