簡體   English   中英

Python TKinter綁定以輸入密鑰

[英]Python TKinter binding to enter key

我試過應用其他幾個SO問題答案中給出的各種示例,但這使我難以理解。

我的目標是當按下“輸入”時能夠將一行文本發送到telnet服務器。 我要做的就是簡單地將最后一行(因為按下了上一個“輸入”)發送到輸出面板。

我得到了一組笨拙的窗口,似乎在它們上面附加了文本框,但是當我應用任何綁定類型代碼時,我最終無法在輸入文本框中書寫。 當我刪除綁定代碼時,我至少可以在任一文本框中鍵入文本。

這個問題與我的其他查詢有關 ,這就是為什么我現在嘗試吸收GUI編碼。

該代碼的骨架來自Tkinter中Thinking in Tkinter 》中來自tut的信息

編輯:代碼行更改為:老虎的評論

from Tkinter import *

class MyApp:
    def __init__(self, parent):

        #------ constants for controlling layout of buttons ------
        button_width = 15
        button_padx = "2m"
        button_pady = "1m"
        buttons_frame_padx =  "3m"
        buttons_frame_pady =  "0m"
        buttons_frame_ipadx = "3m"
        buttons_frame_ipady = "0m"
        # -------------- end button constants ----------------

        # First declare ORIGINAL Window area
        self.myParent = parent
        self.myParent.geometry("640x400")

        # Layer ONE
        ### Our First layer/frame is called frameLayerOne
        self.frameLayerOne = Frame(parent, bg="green")
        self.frameLayerOne.pack(expand=YES, fill=BOTH)

        ### We will stack vertically inside frameLayerOne.
        ### Inside frameLayerOne, we will create 
        ### a menu_frame, then a sub frame into which we will
        ### put an output_frame and an input_frame.

        # Layer TWO
        # MENU FRAME - Layer Two
        self.menu_frame = Frame(self.frameLayerOne, borderwidth=5,  relief=RIDGE, bg="cyan")
        self.menu_frame.pack(side=TOP, expand=NO,  padx=0, pady=0, ipadx=0, ipady=0, fill=X)

        MessageMenuFrame="Menu frame.\n"
        # Label(self.menu_frame, text=MessageMenuFrame, justify=LEFT).pack(side=TOP, anchor=W)

        # buttons frame
        self.buttons_frame = Frame(self.menu_frame) # , bg="red"
        self.buttons_frame.pack(side=TOP,
            ipadx=buttons_frame_ipadx,
            ipady=buttons_frame_ipady,
            padx=buttons_frame_padx,
            pady=buttons_frame_pady,)

        # now we add the buttons to the buttons_frame
        self.button1 = Button(self.buttons_frame, command=self.button1Click)
        self.button1.configure(text="CONNECT", background= "green")
        self.button1.focus_force()
        self.button1.configure(width=button_width,
            padx=button_padx,
            pady=button_pady)

        self.button1.pack(side=LEFT)
        self.button1.bind("<Return>", self.button1Click_a)

        self.button2 = Button(self.buttons_frame, command=self.button2Click)
        self.button2.configure(text="QUIT", background="red")
        self.button2.configure(width=button_width,
            padx=button_padx,
            pady=button_pady)

        self.button2.pack(side=RIGHT)
        self.button2.bind("<Return>", self.button2Click_a)

        # SUB FRAME - Layer Two
        self.sub_frame = Frame(self.frameLayerOne) # , bg="red"
        self.sub_frame.pack(side=BOTTOM, expand=YES,  padx=0, pady=0, ipadx=0, ipady=0, fill=BOTH)

        # Layer THREE
        # INPUT FRAME - Layer Three
        self.input_frame = Frame(self.sub_frame, borderwidth=5,  relief=RIDGE, bg="black")
        self.input_frame.pack(side=BOTTOM, expand=NO,  padx=0, pady=0, ipadx=0, ipady=0, fill=X)

        # Text widget for user input to send to server
        self.InputText = Text(self.input_frame, height=4, bg="black", fg="green")
        self.InputText.pack()
        self.InputText.insert(END, "User input here")

        # Moded these two lines on Tiger's advice
        self.input_frame.bindtags(('.input_frame','input_frame','post-class-bindings', '.', 'all'))
        self.input_frame.bind_class('<Return>', self.return_key)

        # OUTPUT FRAME - Layer Three
        self.output_frame = Frame(self.sub_frame, borderwidth=5,  relief=RIDGE, bg="blue")
        self.output_frame.pack(side=BOTTOM, expand=YES,  padx=0, pady=0, ipadx=5, ipady=25, fill=BOTH)

        # Text widget for output from code and server
        self.OutputText = Text(self.output_frame, bg="black", fg="green")
        self.OutputText.pack()
        self.OutputText.insert(END, "server and code output here")


    def return_key(self, event):
        text = "you pressed Return"
        self.InputText.insert(END, text)

    def button1Click(self):
        if self.button1["background"] == "green":
            self.button1["background"] = "yellow"
        else:
            self.button1["background"] = "green"

    def button1Click_a(self, event):
        self.button1Click()


    def button2Click(self):
        self.myParent.destroy()


    def button2Click_a(self, event):
        self.button2Click()


root = Tk()
myapp = MyApp(root)
root.mainloop()

我對您的代碼進行了一些更改,將注釋T3標記為可見。 這使您可以使用“ ButtonsText字段上的“返回”,並有效地使用“連接”按鈕“搶救”焦點。

from Tkinter import *

class MyApp:
    def __init__(self, parent):

        #------ constants for controlling layout of buttons ------
        button_width = 15
        button_padx = "2m"
        button_pady = "1m"
        buttons_frame_padx =  "3m"
        buttons_frame_pady =  "0m"
        buttons_frame_ipadx = "3m"
        buttons_frame_ipady = "0m"
        # -------------- end button constants ----------------

        # First declare ORIGINAL Window area
        self.myParent = parent
        self.myParent.geometry("640x400")

        # Layer ONE
        ### Our First layer/frame is called frameLayerOne
        self.frameLayerOne = Frame(parent, bg="green")
        self.frameLayerOne.pack(expand=YES, fill=BOTH)

        ### We will stack vertically inside frameLayerOne.
        ### Inside frameLayerOne, we will create 
        ### a menu_frame, then a sub frame into which we will
        ### put an output_frame and an input_frame.

        # Layer TWO
        # MENU FRAME - Layer Two
        self.menu_frame = Frame(self.frameLayerOne, borderwidth=5,  relief=RIDGE, bg="cyan")
        self.menu_frame.pack(side=TOP, expand=NO,  padx=0, pady=0, ipadx=0, ipady=0, fill=X)

        MessageMenuFrame="Menu frame.\n"
        # Label(self.menu_frame, text=MessageMenuFrame, justify=LEFT).pack(side=TOP, anchor=W)

        # buttons frame
        self.buttons_frame = Frame(self.menu_frame) # , bg="red"
        self.buttons_frame.pack(side=TOP,
            ipadx=buttons_frame_ipadx,
            ipady=buttons_frame_ipady,
            padx=buttons_frame_padx,
            pady=buttons_frame_pady,)

        # now we add the buttons to the buttons_frame
        self.button1 = Button(self.buttons_frame, command=self.button1Click)
        self.button1.configure(text="CONNECT", background= "green")
        self.button1.focus_force()
        self.button1.configure(width=button_width,
            padx=button_padx,
            pady=button_pady)

        self.button1.pack(side=LEFT)
        # T3 - bound to regular button1Click
        self.button1.bind("<Return>", self.button1Click)

        self.button2 = Button(self.buttons_frame, command=self.button2Click)
        self.button2.configure(text="QUIT", background="red")
        self.button2.configure(width=button_width,
            padx=button_padx,
            pady=button_pady)

        self.button2.pack(side=RIGHT)
        # T3 - bound to regular button2Click
        self.button2.bind("<Return>", self.button2Click)

        # SUB FRAME - Layer Two
        self.sub_frame = Frame(self.frameLayerOne) # , bg="red"
        self.sub_frame.pack(side=BOTTOM, expand=YES,  padx=0, pady=0, ipadx=0, ipady=0, fill=BOTH)

        # Layer THREE
        # INPUT FRAME - Layer Three
        self.input_frame = Frame(self.sub_frame, borderwidth=5,  relief=RIDGE, bg="black")
        self.input_frame.pack(side=BOTTOM, expand=NO,  padx=0, pady=0, ipadx=0, ipady=0, fill=X)

        # Text widget for user input to send to server
        self.InputText = Text(self.input_frame, height=4, bg="black", fg="green")
        self.InputText.pack()
        self.InputText.insert(END, "User input here")

        self.InputText.bind('<Return>', self.return_key)

        # OUTPUT FRAME - Layer Three
        self.output_frame = Frame(self.sub_frame, borderwidth=5,  relief=RIDGE, bg="blue")
        self.output_frame.pack(side=BOTTOM, expand=YES,  padx=0, pady=0, ipadx=5, ipady=25, fill=BOTH)

        # Text widget for output from code and server
        self.OutputText = Text(self.output_frame, bg="black", fg="green")
        self.OutputText.pack()
        self.OutputText.insert(END, "server and code output here")


    def return_key(self, event):
        text = "you pressed Return"
        self.InputText.insert(END, text)

    def button1Click(self, event=None): # T3 - give it a default event of None
        if self.button1["background"] == "green":
            self.button1["background"] = "yellow"
        else:
            self.button1["background"] = "green"
        self.button1.focus_set() # T3 - set focus to this button so Return works

    def button2Click(self, event=None): # T3 - give it a default event of None
        self.myParent.destroy()

root = Tk()
myapp = MyApp(root)
root.mainloop()

暫無
暫無

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

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