简体   繁体   English

我的 tkinter window 没有显示它应该显示的所有内容

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

I wrote this code and it makes the window I'm trying to create just fine:我写了这段代码,它使我试图创建的 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()

Which looks like this: Pop-up window看起来像这样:弹出 window

The problem is that when I try to turn this code into a pop-up window, it doesn't show everything I defined.问题是,当我尝试将此代码转换为弹出窗口 window 时,它并没有显示我定义的所有内容。 This is the main that calls the 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()

And this is the program as the pop-up window:这是作为弹出窗口 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()

I've tried to find an answer to this all over the internet, but I haven't found anything.我试图在整个互联网上找到这个问题的答案,但我没有找到任何东西。 I'm still fairly new to Python and very new to tkinter.我对 Python 还是很陌生,对 tkinter 还是很陌生。

After being shown how to use self correctly, I figured out what was wrong with the code.在展示了如何正确使用 self 之后,我发现了代码有什么问题。 I'm putting the fixed code here for anyone else who might run into this.我将固定代码放在这里,以供其他可能遇到此问题的人使用。

Summarized Fix:总结修复:

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

If anyone would like to see the full program, here it is:如果有人想看完整的程序,这里是:

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