簡體   English   中英

我的 tkinter window 沒有顯示它應該顯示的所有內容

[英]My tkinter window isn't showing everything it should

我寫了這段代碼,它使我試圖創建的 window 很好:

import math
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle

radValue = ""

def submit():
    rangeWin.destroy()

rangeWin = tk.Tk()
rangeWin.title("Range Calculator")
style = ThemedStyle(rangeWin)
style.theme_use("equilux")
bg = style.lookup('TLabel', 'background')
fg = style.lookup('TLabel', 'foreground')
rangeWin.configure(bg=style.lookup('TLabel', 'background'))
upperFrame = ttk.Frame(master=rangeWin)
lowerFrame = ttk.Frame(master=rangeWin)
underFrame = ttk.Frame(master=rangeWin)

frame1_1 = ttk.Frame(master=upperFrame)
frame1_2 = ttk.Frame(master=upperFrame)
frame2_1 = ttk.Frame(master=upperFrame)
frame2_2 = ttk.Frame(master=upperFrame)
frame3_1 = ttk.Frame(master=upperFrame)
frame3_2 = ttk.Frame(master=upperFrame)
frameList = [frame1_1, frame1_2, frame2_1, frame2_2, frame3_1, frame3_2]

upperFrame.grid(row=0, column=0, sticky="w")
lowerFrame.grid(row=1, column=0, sticky="w")
underFrame.grid(row=2, column=0, pady=8)
frRow = 0
frCol = 0
for fr in frameList:
    fr.grid(row=frRow, column = frCol, padx=5, pady=5, sticky="w")
    frCol += 1
    if frCol == 2:
        frCol = 0
        frRow += 1

lblName = ttk.Label(master=frame1_1, text="Name")
entName = ttk.Entry(master=frame1_1, width=10)
lblName.grid(row=0, column=0, sticky="w")
entName.grid(row=0, column=1, sticky="e")

lblHP = ttk.Label(master=frame1_2, text="HP")
entHP = ttk.Entry(master=frame1_2, width=8)
lblHP.grid(row=0, column=0, sticky="w")
entHP.grid(row=0, column=1, sticky="e")

lblCoord = ttk.Label(master=frame2_1, text="Coordinate")
entXCoord = ttk.Entry(master=frame2_1, width=2)
lblX = ttk.Label(master=frame2_1, text="X")
entYCoord = ttk.Entry(master=frame2_1, width=2)
lblY = ttk.Label(master=frame2_1, text="Y")
entZCoord = ttk.Entry(master=frame2_1, width=2)
lblZ = ttk.Label(master=frame2_1, text="Z")
lblCoord.grid(row=0, column=0, sticky="w")
entXCoord.grid(row=0, column=1, sticky="e")
lblX.grid(row=0, column=2, sticky="e")
entYCoord.grid(row=0, column=3, sticky="e")
lblY.grid(row=0, column=4, sticky="e")
entZCoord.grid(row=0, column=5, sticky="e")
lblZ.grid(row=0, column=6, sticky="e")

lblHeight = ttk.Label(master=frame2_2, text="Height (Blocks)")
entHeight = ttk.Entry(master=frame2_2, width=8)
lblHeight.grid(row=0, column=0, sticky="w")
entHeight.grid(row=0, column=1, sticky="e")

frameSizeLeft = ttk.Frame(master=frame3_1)
frameSizeRight = ttk.Frame(master=frame3_1)
lblSize = ttk.Label(master=frame3_1, text="Size Class")
rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= radValue, value="Tiny")
rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= radValue, value="Small")
rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= radValue, value="Medium")
rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= radValue, value="Large")
rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= radValue, value="Huge")
rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= radValue, value="Gargantuan")
lblSize.grid(row=0, column=0)
frameSizeLeft.grid(row=1, column=0)
frameSizeRight.grid(row=1, column=1)
rbnTiny.grid(row=0, column=0, sticky="w")
rbnSmall.grid(row=0, column=0, sticky="w")
rbnMedium.grid(row=1, column=0, sticky="w")
rbnLarge.grid(row=1, column=0, sticky="w")
rbnHuge.grid(row=2, column=0, sticky="w")
rbnGargantuan.grid(row=2, column=0, sticky="w")

lblNotes = ttk.Label(master=lowerFrame, text="Notes")
txtNotes = tk.Text(master=lowerFrame)
lblNotes.grid(row=0, column=0)
txtNotes.grid(row=1, column=0, sticky="w")

btnSubmit = ttk.Button(master=underFrame, command=submit, text="Submit")
btnSubmit.grid(row=0, column=0)

rangeWin.mainloop()

看起來像這樣:彈出 window

問題是,當我嘗試將此代碼轉換為彈出窗口 window 時,它並沒有顯示我定義的所有內容。 這是調用 window 的主要部分:

from rangeCalculator import RangeCalculator
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle

window = tk.Tk()
window.title("BattleTracker")
#window.geometry("200x200")
style = ThemedStyle(window)
style.theme_use("equilux")
bg = style.lookup('TLabel', 'background')
fg = style.lookup('TLabel', 'foreground')
window.configure(bg=style.lookup('TLabel', 'background'))
newChar = RangeCalculator(window)

lblGreeting = ttk.Label(master=window, text="Welcome to the BattleTracker")
lblGreeting.grid(row=0, column=0)
btnOpen = ttk.Button(master=window, text="Input Stats")
btnOpen.bind("<Button>", lambda e: newChar.generateWindow())
btnOpen.grid(row=1, column=0)

window.mainloop()

這是作為彈出窗口 window 的程序:

import math
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle


class RangeCalculator:
    def __init__(self, win = None):
        self.win = win
        radValue = ""
        stats = {}

    def generateWindow(self):
        rangeWin = tk.Toplevel(master=self.win)
        rangeWin.title("Range Calculator")
        style = ThemedStyle(rangeWin)
        style.theme_use("equilux")
        bg = style.lookup('TLabel', 'background')
        fg = style.lookup('TLabel', 'foreground')
        rangeWin.configure(bg=style.lookup('TLabel', 'background'))
        upperFrame = ttk.Frame(master=rangeWin)
        lowerFrame = ttk.Frame(master=rangeWin)
        underFrame = ttk.Frame(master=rangeWin)

        frame1_1 = ttk.Frame(master=upperFrame)
        frame1_2 = ttk.Frame(master=upperFrame)
        frame2_1 = ttk.Frame(master=upperFrame)
        frame2_2 = ttk.Frame(master=upperFrame)
        frame3_1 = ttk.Frame(master=upperFrame)
        frame3_2 = ttk.Frame(master=upperFrame)
        frameList = [frame1_1, frame1_2, frame2_1, frame2_2, frame3_1, frame3_2]

        upperFrame.grid(row=0, column=0, sticky="w")
        lowerFrame.grid(row=1, column=0, sticky="w")
        underFrame.grid(row=2, column=0, pady=8)
        frRow = 0
        frCol = 0
        for fr in frameList:
            fr.grid(row=frRow, column = frCol, padx=5, pady=5, sticky="w")
            frCol += 1
            if frCol == 2:
                frCol = 0
                frRow += 1

        lblName = ttk.Label(master=frame1_1, text="Name")
        entName = ttk.Entry(master=frame1_1, width=10)
        lblName.grid(row=0, column=0, sticky="w")
        entName.grid(row=0, column=1, sticky="e")

        lblHP = ttk.Label(master=frame1_2, text="HP")
        entHP = ttk.Entry(master=frame1_2, width=8)
        lblHP.grid(row=0, column=0, sticky="w")
        entHP.grid(row=0, column=1, sticky="e")

        lblCoord = ttk.Label(master=frame2_1, text="Coordinate")
        entXCoord = ttk.Entry(master=frame2_1, width=2)
        lblX = ttk.Label(master=frame2_1, text="X")
        entYCoord = ttk.Entry(master=frame2_1, width=2)
        lblY = ttk.Label(master=frame2_1, text="Y")
        entZCoord = ttk.Entry(master=frame2_1, width=2)
        lblZ = ttk.Label(master=frame2_1, text="Z")
        lblCoord.grid(row=0, column=0, sticky="w")
        entXCoord.grid(row=0, column=1, sticky="e")
        lblX.grid(row=0, column=2, sticky="e")
        entYCoord.grid(row=0, column=3, sticky="e")
        lblY.grid(row=0, column=4, sticky="e")
        entZCoord.grid(row=0, column=5, sticky="e")
        lblZ.grid(row=0, column=6, sticky="e")

        lblHeight = ttk.Label(master=frame2_2, text="Height (Blocks)")
        entHeight = ttk.Entry(master=frame2_2, width=8)
        lblHeight.grid(row=0, column=0, sticky="w")
        entHeight.grid(row=0, column=1, sticky="e")

        frameSizeLeft = ttk.Frame(master=frame3_1)
        frameSizeRight = ttk.Frame(master=frame3_1)
        lblSize = ttk.Label(master=frame3_1, text="Size Class")
        rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= radValue, value="Tiny")
        rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= radValue, value="Small")
        rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= radValue, value="Medium")
        rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= radValue, value="Large")
        rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= radValue, value="Huge")
        rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= radValue, value="Gargantuan")
        lblSize.grid(row=0, column=0)
        frameSizeLeft.grid(row=1, column=0)
        frameSizeRight.grid(row=1, column=1)
        rbnTiny.grid(row=0, column=0, sticky="w")
        rbnSmall.grid(row=0, column=0, sticky="w")
        rbnMedium.grid(row=1, column=0, sticky="w")
        rbnLarge.grid(row=1, column=0, sticky="w")
        rbnHuge.grid(row=2, column=0, sticky="w")
        rbnGargantuan.grid(row=2, column=0, sticky="w")

        lblNotes = ttk.Label(master=lowerFrame, text="Notes")
        txtNotes = tk.Text(master=lowerFrame)
        lblNotes.grid(row=0, column=0)
        txtNotes.grid(row=1, column=0, sticky="w")

        btnSubmit = ttk.Button(master=underFrame, command=submit, text="Submit")
        btnSubmit.grid(row=0, column=0)

    def collectStats():
        stats = {
            "name": entName.get(),
            "hP": entHP.get(),
            "coordinate": [entXCoord.get(), entYCoord.get(), entZCoord.get()],
            "height": entHeight.get(),
            "size": radValue,
            "notes": txtNotes.get(1.0, tk.END)
        }
    
    def submit():
        rangeWin.destroy()

我試圖在整個互聯網上找到這個問題的答案,但我沒有找到任何東西。 我對 Python 還是很陌生,對 tkinter 還是很陌生。

在展示了如何正確使用 self 之后,我發現了代碼有什么問題。 我將固定代碼放在這里,以供其他可能遇到此問題的人使用。

總結修復:

class RangeCalculator:
    ...
    def generateWindow(self):
        ...
        # The radValue needed self prepended to it.
        rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= self.radValue, value="Tiny")
        rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= self.radValue, value="Small")
        rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= self.radValue, value="Medium")
        rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= self.radValue, value="Large")
        rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= self.radValue, value="Huge")
        rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= self.radValue, value="Gargantuan")
        ...

    # This also needed self to be implemented.
    def collectStats(self):
        stats = {
            "name": self.entName.get(),
            "hP": self.entHP.get(),
            "coordinate": [self.entXCoord.get(), self.entYCoord.get(), self.entZCoord.get()],
            "height": self.entHeight.get(),
            "size": self.radValue,
            "notes": self.txtNotes.get(1.0, tk.END)
        }

如果有人想看完整的程序,這里是:

import math
import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedStyle


class RangeCalculator:
    def __init__(self, win = None):
        self.win = win
        self.radValue = ""
        self.stats = {}

    def generateWindow(self):
        rangeWin = tk.Toplevel(master=self.win)
        rangeWin.title("Range Calculator")
        style = ThemedStyle(rangeWin)
        style.theme_use("equilux")
        bg = style.lookup('TLabel', 'background')
        fg = style.lookup('TLabel', 'foreground')
        rangeWin.configure(bg=style.lookup('TLabel', 'background'))
        upperFrame = ttk.Frame(master=rangeWin)
        lowerFrame = ttk.Frame(master=rangeWin)
        underFrame = ttk.Frame(master=rangeWin)

        frame1_1 = ttk.Frame(master=upperFrame)
        frame1_2 = ttk.Frame(master=upperFrame)
        frame2_1 = ttk.Frame(master=upperFrame)
        frame2_2 = ttk.Frame(master=upperFrame)
        frame3_1 = ttk.Frame(master=upperFrame)
        frame3_2 = ttk.Frame(master=upperFrame)
        frameList = [frame1_1, frame1_2, frame2_1, frame2_2, frame3_1, frame3_2]

        upperFrame.grid(row=0, column=0, sticky="w")
        lowerFrame.grid(row=1, column=0, sticky="w")
        underFrame.grid(row=2, column=0, pady=8)
        frRow = 0
        frCol = 0
        for fr in frameList:
            fr.grid(row=frRow, column = frCol, padx=5, pady=5, sticky="w")
            frCol += 1
            if frCol == 2:
                frCol = 0
                frRow += 1

        lblName = ttk.Label(master=frame1_1, text="Name")
        entName = ttk.Entry(master=frame1_1, width=10)
        lblName.grid(row=0, column=0, sticky="w")
        entName.grid(row=0, column=1, sticky="e")

        lblHP = ttk.Label(master=frame1_2, text="HP")
        entHP = ttk.Entry(master=frame1_2, width=8)
        lblHP.grid(row=0, column=0, sticky="w")
        entHP.grid(row=0, column=1, sticky="e")

        lblCoord = ttk.Label(master=frame2_1, text="Coordinate")
        entXCoord = ttk.Entry(master=frame2_1, width=2)
        lblX = ttk.Label(master=frame2_1, text="X")
        entYCoord = ttk.Entry(master=frame2_1, width=2)
        lblY = ttk.Label(master=frame2_1, text="Y")
        entZCoord = ttk.Entry(master=frame2_1, width=2)
        lblZ = ttk.Label(master=frame2_1, text="Z")
        lblCoord.grid(row=0, column=0, sticky="w")
        entXCoord.grid(row=0, column=1, sticky="e")
        lblX.grid(row=0, column=2, sticky="e")
        entYCoord.grid(row=0, column=3, sticky="e")
        lblY.grid(row=0, column=4, sticky="e")
        entZCoord.grid(row=0, column=5, sticky="e")
        lblZ.grid(row=0, column=6, sticky="e")

        lblHeight = ttk.Label(master=frame2_2, text="Height (Blocks)")
        entHeight = ttk.Entry(master=frame2_2, width=8)
        lblHeight.grid(row=0, column=0, sticky="w")
        entHeight.grid(row=0, column=1, sticky="e")

        frameSizeLeft = ttk.Frame(master=frame3_1)
        frameSizeRight = ttk.Frame(master=frame3_1)
        lblSize = ttk.Label(master=frame3_1, text="Size Class")

        # This is what was causing the window to only show up to this point
        # The radValue needed self prepended to it

        rbnTiny = ttk.Radiobutton(master=frameSizeLeft, text="Tiny", variable= self.radValue, value="Tiny")
        rbnSmall = ttk.Radiobutton(master=frameSizeRight, text="Small", variable= self.radValue, value="Small")
        rbnMedium = ttk.Radiobutton(master=frameSizeLeft, text="Medium", variable= self.radValue, value="Medium")
        rbnLarge = ttk.Radiobutton(master=frameSizeRight, text="Large", variable= self.radValue, value="Large")
        rbnHuge = ttk.Radiobutton(master=frameSizeLeft, text="Huge", variable= self.radValue, value="Huge")
        rbnGargantuan = ttk.Radiobutton(master=frameSizeRight, text="Gargantuan", variable= self.radValue, value="Gargantuan")
        lblSize.grid(row=0, column=0)
        frameSizeLeft.grid(row=1, column=0)
        frameSizeRight.grid(row=1, column=1)
        rbnTiny.grid(row=0, column=0, sticky="w")
        rbnSmall.grid(row=0, column=0, sticky="w")
        rbnMedium.grid(row=1, column=0, sticky="w")
        rbnLarge.grid(row=1, column=0, sticky="w")
        rbnHuge.grid(row=2, column=0, sticky="w")
        rbnGargantuan.grid(row=2, column=0, sticky="w")

        lblNotes = ttk.Label(master=lowerFrame, text="Notes")
        txtNotes = tk.Text(master=lowerFrame)
        lblNotes.grid(row=0, column=0)
        txtNotes.grid(row=1, column=0, sticky="w")

        btnSubmit = ttk.Button(master=underFrame, command=self.submit, text="Submit")
        btnSubmit.grid(row=0, column=0)

    # Passed in self
    def collectStats(self):
        stats = {
            "name": self.entName.get(),
            "hP": self.entHP.get(),
            "coordinate": [self.entXCoord.get(), self.entYCoord.get(), self.entZCoord.get()],
            "height": self.entHeight.get(),
            "size": self.radValue,
            "notes": self.txtNotes.get(1.0, tk.END)
        }
    
    def submit():
        rangeWin.destroy()

暫無
暫無

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

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