簡體   English   中英

Tkinter 在使用嵌套類時在輸入框中顯示 output

[英]Tkinter displaying output in a entry box using when using nested classes

所以問題是,當使用第二個 window(您使用下一頁按鈕導航到它)時。 當我在每個框中輸入 8 位二進制數時,前提是它應該將它們加在一起並顯示在標記為添加的二進制框中。 但目前它似乎沒有正確設置值來執行此操作,它只是在命令行中打印我設置的值,這表明該方法正在運行。

任何有關如何解決此問題的見解都將不勝感激。 僅供參考,它是故意為 8 位二進制文件完成的,是的,它需要使用嵌套類。 因為那是作業需要使用的。

抱歉,如果這只是一個小錯誤並且我在某處笨拙但我已經被難住了一段時間。

這是修改后的最小可重現示例:

from tkinter import * 
from tkinter.ttk import *
from tkinter import ttk
import tkinter
import math
import sys

def BinaryAddition(value1, value2):
    if len(value1) != 8:
        return "Binary number 1 is not 8 bits"
    if len(value2) != 8:
        return "Binary number 2 is not 8 bits"
    res = bin(int(value1,2) + int(value2,2))
    Ob = res[2:]#removing the ob prefix 
    return Ob

class MainWindow():
    
    FONT = ("Consolas", 16)
    TxtMaxLen = 32


    class SecondWindow():
        def __init__(self2):
            self2._window = tkinter.Tk()
            self2._window.title("Converter")
            self2._window["bg"] = "#EFFFA3"
            f = ("Times bold", 16)
            TxtMaxLen = 32
            self2._window.geometry("820x240")

            label = tkinter.Label(self2._window, text="Binary Number 1: ", font= f)#label defined for number input box 
            label.grid(row=0, column=0, padx=10, pady=5)#positioning / dimensions of input box
            
            label = tkinter.Label(self2._window, text="Binary Number 2: ", font= f)#label defined for number input box 
            label.grid(row=1, column=0, padx=10, pady=5)#positioning / dimensions of input box

            #input box for binary number 1 
            self2.input1 = tkinter.Entry(self2._window, width= TxtMaxLen, font= f) #defined input box 
            self2.input1.grid(row=0, column=1, pady=5)#postioning / dimensions of input box
            self2.input1.focus()

            #input box for binary number 2 
            self2.input2 = tkinter.Entry(self2._window, width=TxtMaxLen, font= f) #defined input box 
            self2.input2.grid(row=1, column=1, pady=5)#postioning / dimensions of input box
            self2.input2.focus()

            separator = tkinter.ttk.Separator(self2._window,orient=tkinter.HORIZONTAL)
            separator.grid(row=3, column=1, pady=15)


            self2._bt_Add = tkinter.Button(self2._window, text="Add", font= f, command = self2.AdditionSelection)#button defined for bin  
            self2._bt_Add.grid(row=1, column=2, padx=5, pady=5)#postioning / dimensions of button box        

            #labels for output box of combined binary number
            label = tkinter.Label(self2._window, text="Added Binary: ", font= f)#label defined for number input box 
            label.grid(row=4, column=0, padx=10, pady=5)#positioning / dimensions of input box

            #label for output  box for if there was or was not an overflow
            label = tkinter.Label(self2._window, text="OverFlow: ", font= f)#label defined for number input box 
            label.grid(row=5, column=0, padx=10, pady=5)#positioning / dimensions of input box

            #output box for the added binary number
            self2.stringvar_Combined = tkinter.StringVar()
            txt_output = tkinter.Entry(self2._window, textvariable=self2.stringvar_Combined, width=TxtMaxLen, state="readonly", font= f)#entry box set to readonly to act as a display box 
            txt_output.grid(row=4, column=1, pady=5)
            
            #output box for if there was or was not an overflow
            self2._stringvar_OverFlow = tkinter.StringVar()
            txt_output = tkinter.Entry(self2._window, textvariable=self2._stringvar_OverFlow, width=TxtMaxLen, state="readonly", font= f)#entry box set to readonly to act as a display box 
            txt_output.grid(row=5, column=1, pady=5)

            separator = tkinter.ttk.Separator(self2._window,orient=tkinter.VERTICAL)
            separator.grid(row=3, column=2, pady=15)


            PrevPageButton = tkinter.Button(self2._window, text="Previous Page", font=f, command=MainWindow)
            PrevPageButton.grid(row=5, column = 2, padx = 5,pady = 5)


        def set_values(self, BinAdd):
            self.stringvar_Combined.set(BinAdd)
 
        def AdditionSelection(self2):
                    try:
                        BinV1 = self2.input1.get().strip().replace(" ", "")
                        BinV2 = self2.input2.get().strip().replace(" ", "")
                        BinAdd = BinaryAddition(BinV1, BinV2)

                        self2.set_values(BinAdd)
                        print(BinAdd)
                        print("hi there")

                    except Exception as ex:
                        print("NOPE it aint workin")

    def __init__(self):
        self._window = tkinter.Tk()
        self._window.title("Converter")
        self._window["bg"] = "#20A3FF" #background colour
        self._window.geometry("820x240")#setting window size

        #setting up button for binary additon page
        NextPageButton = tkinter.Button(self._window, text="Next Page", font=MainWindow.FONT, command=self.SecondWindow)
        NextPageButton.grid(row=4, column = 3, padx = 5,pady = 5)
        self._window.destroy
        
    def mainloop(self):
        self._window.mainloop()

if __name__ == "__main__":
    win = MainWindow()
    win.mainloop()

主要問題:要創建第二個 window,您應該使用Toplevel()而不是Tk()

當我使用Toplevel時,它會在 window 中顯示文本。


如果你只想看到一個 window 那么你應該首先destroy() old window 然后你可以使用Tk()創建新的 window (使用新的mainloop() )。

但這會造成其他問題。 它刪除 window 中的所有值,當您返回一些 window 時,它將不再具有舊值。 創建兩個Frames並在不破壞它們的情況下在Tk()中替換它們可能會更好 - 它們將保留舊值。


Rest 只是建議如何創建更具可讀性的代碼:

  • 不要將SecondWindow放在MainWindow
  • 不要使用self2
  • 對函數和變量使用lower_case_names

PEP 8 中的更多內容——Python 代碼的樣式指南


代碼有一些變化。

它顯示值(我還添加了.zfill(8)來顯示 8 位數字)

但這每次更改 window 時都會創建新的 window - nextprevious - 所以你可能有兩個主要的 windows 等。它需要更多更改。

import tkinter   # PEP8: `import *` is not preferred
from tkinter import ttk
import math
import sys

def binary_addition(value1, value2):
    if len(value1) != 8:
        return "Binary number 1 is not 8 bits"
    if len(value2) != 8:
        return "Binary number 2 is not 8 bits"
    res = bin(int(value1,2) + int(value2,2))
    return res[2:].zfill(8) #removing the ob prefix 


class MainWindow():
    
    FONT = ("Consolas", 16)
    TxtMaxLen = 32

    def __init__(self):
        self._window = tkinter.Tk()
        self._window.title("Converter")
        self._window["bg"] = "#20A3FF" #background colour
        self._window.geometry("820x240")#setting window size

        #setting up button for binary additon page
        next_page_button = tkinter.Button(self._window, text="Next Page", font=MainWindow.FONT, command=SecondWindow)
        next_page_button.grid(row=4, column = 3, padx = 5,pady = 5)
        
    def mainloop(self):
        self._window.mainloop()

class SecondWindow():
    
    def __init__(self):
        self._window = tkinter.Toplevel()
        self._window.title("Converter")
        self._window["bg"] = "#EFFFA3"
        
        f = ("Times bold", 16)
        TxtMaxLen = 32
        
        self._window.geometry("820x240")

        label = tkinter.Label(self._window, text="Binary Number 1: ", font= f)#label defined for number input box 
        label.grid(row=0, column=0, padx=10, pady=5)#positioning / dimensions of input box
        
        label = tkinter.Label(self._window, text="Binary Number 2: ", font= f)#label defined for number input box 
        label.grid(row=1, column=0, padx=10, pady=5)#positioning / dimensions of input box

        #input box for binary number 1 
        self.input1 = tkinter.Entry(self._window, width= TxtMaxLen, font= f) #defined input box 
        self.input1.grid(row=0, column=1, pady=5)#postioning / dimensions of input box
        self.input1.focus()

        #input box for binary number 2 
        self.input2 = tkinter.Entry(self._window, width=TxtMaxLen, font= f) #defined input box 
        self.input2.grid(row=1, column=1, pady=5)#postioning / dimensions of input box
        self.input2.focus()

        separator = tkinter.ttk.Separator(self._window,orient=tkinter.HORIZONTAL)
        separator.grid(row=3, column=1, pady=15)


        self._bt_add = tkinter.Button(self._window, text="Add", font= f, command = self.addition_selection)#button defined for bin  
        self._bt_add.grid(row=1, column=2, padx=5, pady=5)#postioning / dimensions of button box        

        #labels for output box of combined binary number
        label = tkinter.Label(self._window, text="Added Binary: ", font= f)#label defined for number input box 
        label.grid(row=4, column=0, padx=10, pady=5)#positioning / dimensions of input box

        #label for output  box for if there was or was not an overflow
        label = tkinter.Label(self._window, text="OverFlow: ", font= f)#label defined for number input box 
        label.grid(row=5, column=0, padx=10, pady=5)#positioning / dimensions of input box

        #output box for the added binary number
        self.stringvar_combined = tkinter.StringVar()
        txt_output = tkinter.Entry(self._window, textvariable=self.stringvar_combined, width=TxtMaxLen, state="readonly", font= f)#entry box set to readonly to act as a display box 
        txt_output.grid(row=4, column=1, pady=5)
        
        #output box for if there was or was not an overflow
        self._stringvar_overflow = tkinter.StringVar()
        txt_output = tkinter.Entry(self._window, textvariable=self._stringvar_overflow, width=TxtMaxLen, state="readonly", font= f)#entry box set to readonly to act as a display box 
        txt_output.grid(row=5, column=1, pady=5)

        separator = tkinter.ttk.Separator(self._window,orient=tkinter.VERTICAL)
        separator.grid(row=3, column=2, pady=15)

        prev_page_button = tkinter.Button(self._window, text="Previous Page", font=f, command=MainWindow)
        prev_page_button.grid(row=5, column = 2, padx = 5,pady = 5)

    def set_values(self, value):
        self.stringvar_combined.set(value)

    def addition_selection(self):
        try:
            bin_1 = self.input1.get().strip().replace(" ", "")
            bin_2 = self.input2.get().strip().replace(" ", "")
            bin_add = binary_addition(bin_1, bin_2)

            self.set_values(bin_add)
            print("bin_add:", bin_add)

        except Exception as ex:
            print("NOPE it aint workin", ex)


if __name__ == "__main__":
    win = MainWindow()
    win.mainloop()

暫無
暫無

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

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