簡體   English   中英

Python Tkinter:有沒有辦法防止“標簽”文本將列推到一邊?

[英]Python Tkinter: Is there a way prevent 'Label' text from pushing columns to the side?

我對 Python 的 Tkinter 庫工具很陌生。 目前,當用戶向服務器節點輸入正確的登錄憑據時,我正在嘗試在屏幕上輸出文本。 當我圍繞這個 GUI 組織事物時,我使用的是grid而不是pack

有沒有辦法防止Label文本將列推到一邊?


這是當前 GUI 的樣子:

在此處輸入圖片說明

...當我“登錄”到服務器節點時,屏幕上顯示一些確認文本時會發生以下情況:

在此處輸入圖片說明

......這就是我希望發生的事情(photoshopped):

在此處輸入圖片說明

...並使用@Bryan Oakley 的反饋(細微差別):

在此處輸入圖片說明

我可以移動第二列column=1上的文本,但文本框輸入模塊右側有一些內容(我不會在這個問題中顯示)。 我最初的想法是,也許 GUI 有一些層優先級,所以也許我可以在底層設置文本,這樣它就不會影響文本框,但我沒有在Tkinter 的官方文檔中找到任何關於如何做到這一點的信息。


這是我的一些代碼:

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()            

在這種特定情況下,最簡單的解決方案是讓底部標簽跨越一列以上。

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

當然,這假設您只使用 2 列。 如果您使用更多,請調整columnspan以適合您的整體設計。

但是,如果文本太長而無法放入窗口,即使這樣也不夠。 在這種情況下,您需要為小部件提供固定大小。 當你這樣做時,標簽的內容不會導致標簽改變大小。

通常,我為這樣的小部件所做的是給它一個大小,讓標簽跨越您正在使用的所有列,然后使用sticky屬性讓小部件“粘”到分配給的空間的兩側它。 這將導致標簽增長以適應空間,但由於您已給出明確的請求大小,因此更改文本不會更改標簽的大小。

話雖如此,更簡單的方法是將您的窗口分為兩部分:頂部將是一個包含所有小部件的框架,而底部將僅包含標簽。 然后您可以使用pack輕松排列頂部和底部部分,然后您可以使用grid在框架中布置小部件,但是因為標簽在框架之外它不會影響任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM