2017-05-04 5 views
0

これは私の問題です。私はtkinterとソケットを使ってメッセンジャーアプリケーションを作っていますが、私のGUIでは着信メッセージと発信メッセージを表示するためにラベルウィジェットを使用しています。私がしようとしているのは、ラベルに表示されたコードのようなリストから項目を取り出し、それを画面に表示させることです。私は文字列変数を使用してみましたが、それはリストから呼び出し項目を傾けることはできません。私はこのような年齢のように見えるので、誰かが修正やそれを行うためのよりよい方法を知っている場合は私に知らせてください。過去のテキストにTkinterラベルが上書きされます。リストを使用しているので、StringVar()を使用することはできません。

# Easy settings 
allow_incoming_connections = True # Allows anyone with your ip and port to connect to you. ('True' or 'False') 
con_url = "google.com" 
con_ip = "" 
con_port = "80" 
#Add a IP blocker. sock.deny(idktheactuaulcode) 

#Dont mess with the programming... it is barely held together xD 
connected = False 
from random import randrange 
from tkinter import ttk 
from tkinter import * 
import tkinter as tk, socket, sys, tkinter.messagebox as tm, random 
window = Tk() 
window.geometry("500x260") 
window.resizable(width=FALSE, height=FALSE) 
window.iconbitmap(None)#make icon later after coding is done 
window.title("Private Messenger") 
window.cache = ['TkMessage','- Base 64 data encryption','- /host or /join a chat','- Saving supported','','','- /help for help','','','','Please select an alias:'] 
window.alias = StringVar() 
if con_ip == "": 
    con_ip = socket.gethostbyname(con_url) 
class tkframe(Frame): 
    def __init__(self, master): 
     super().__init__(master) 
     window.bind("<Return>", self.send) 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     sock.bind((socket.gethostbyname(socket.gethostname()), 4545)) 
     sock = socket.create_connection((con_ip, con_port),5) 
#Variables  
     self.user_input = StringVar() 
     self.updatewig() 
    def updatewig(self): 
     self.user_input.set("") 
     input_box = Entry(self, textvariable = self.user_input, width=65).grid(row=12, column=1, sticky=W) 
     input_button = ttk.Button(self, command = self.send, text="Send").grid(row=12, column=2, sticky=W) 
     self.textdisp = Label(self, text = window.cache[0]).grid(row=1, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[1]).grid(row=2, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[2]).grid(row=3, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[3]).grid(row=4, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[4]).grid(row=5, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[5]).grid(row=6, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[6]).grid(row=7, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[7]).grid(row=8, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[8]).grid(row=9, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[9]).grid(row=10, column=1, sticky=W) 
     self.textdisp = Label(self, text = window.cache[10]).grid(row=11, column=1, sticky=W) 
     self.grid() 
    def send(self): 
     #self.textdisp.withdraw() 
     try: 
      self.char_check = str(self.user_input.get())[0] 
     except: 
      pass 
     print(self.char_check) 
     self.command = self.user_input.get() 
     if self.char_check == "/": 
      window.cache.append(self.user_input.get()) 
      del window.cache[0] 
      self.user_input.set("") 
      self.function() 
     else: 
      try: 
       #send 
       window.cache.append(("Me> "+self.user_input.get())) 
       del window.cache[0] 
      except: 
       print("Message could not be sent") 
      print(window.cache) 
      self.updatewig() 
    def function(self): 
    # One long if statement to define all the commands 
     if self.command == "/host": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/join": 
      window.cache.append(("Enter IP:")) 
      window.con_ip = self.user_input.get() 
      del window.cache[0] 
      window.cache.append(("Enter Port:")) 
      window.con_port = self.user_input.get() 
      del window.cache[0] 
      window.cache.append(("Enter alias:")) 
      window.alias = self.user_input.get() 
      del window.cache[0] 
     elif self.command == "/changealias": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/close": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/ban": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/encodeon": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/encodeoff": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/commands": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/mysettings": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/reset": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 

FRAME = tkframe(window) 
window.mainloop() 

答えて

1

あなたが実際にいつでもあなたがself.updatewigだけではなく、テキストを変更するので呼び出して、既存のものの上に(EntryButtonウィジェットに加えて)新しいLabelウィジェットを作成しています。ラベルのテキストを変更するには、configメソッドを使用する必要があります。

グリッドがNoneを返し、Noneタイプでconfigを使用できないため、ラベル作成をプレースメント(grid)から分離する必要があります。また、後で呼び出すことができるように、ウィジェットに別々の名前を付ける必要があります。

updatewigがラベルのテキストのみを変更するように、ウィジェットの作成を__init__メソッドに移動しました。ここで

はコードですが、私はそれはあなたが期待されるように動作します願っています:

# Easy settings 
allow_incoming_connections = True # Allows anyone with your ip and port to connect to you. ('True' or 'False') 
con_url = "google.com" 
con_ip = "" 
con_port = "80" 
#Add a IP blocker. sock.deny(idktheactuaulcode) 

#Dont mess with the programming... it is barely held together xD 
connected = False 
from random import randrange 
from tkinter import ttk 
from tkinter import * 
import tkinter as tk, socket, sys, tkinter.messagebox as tm, random 
window = Tk() 
window.geometry("500x260") 
window.resizable(width=FALSE, height=FALSE) 
window.iconbitmap(None)#make icon later after coding is done 
window.title("Private Messenger") 
window.cache = ['TkMessage','- Base 64 data encryption','- /host or /join a chat','- Saving supported','','','- /help for help','','','','Please select an alias:'] 
window.alias = StringVar() 
if con_ip == "": 
    con_ip = socket.gethostbyname(con_url) 
class tkframe(Frame): 
    def __init__(self, master): 
     super().__init__(master) 
     window.bind("<Return>", self.send) 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     sock.bind((socket.gethostbyname(socket.gethostname()), 4545)) 
     sock = socket.create_connection((con_ip, con_port),5) 

    #Variables  
     self.user_input = StringVar() 

     ## Create widgets (input, button, labels) only once 
     input_box = Entry(self, textvariable = self.user_input, width=65).grid(row=12, column=1, sticky=W) 
     input_button = ttk.Button(self, command = self.send, text="Send").grid(row=12, column=2, sticky=W) 

     ## Seperate label creation from grid (because grid will return 'None') 
     ## Give labels different names 
     self.textdisp00 = Label(self, text = "") 
     self.textdisp01 = Label(self, text = "") 
     self.textdisp02 = Label(self, text = "") 
     self.textdisp03 = Label(self, text = "") 
     self.textdisp04 = Label(self, text = "") 
     self.textdisp05 = Label(self, text = "") 
     self.textdisp06 = Label(self, text = "") 
     self.textdisp07 = Label(self, text = "") 
     self.textdisp08 = Label(self, text = "") 
     self.textdisp09 = Label(self, text = "") 
     self.textdisp10 = Label(self, text = "") 

     ## Grid the labels 
     self.textdisp00.grid(row=1, column=1, sticky=W) 
     self.textdisp01.grid(row=2, column=1, sticky=W) 
     self.textdisp02.grid(row=3, column=1, sticky=W) 
     self.textdisp03.grid(row=4, column=1, sticky=W) 
     self.textdisp04.grid(row=5, column=1, sticky=W) 
     self.textdisp05.grid(row=6, column=1, sticky=W) 
     self.textdisp06.grid(row=7, column=1, sticky=W) 
     self.textdisp07.grid(row=8, column=1, sticky=W) 
     self.textdisp08.grid(row=9, column=1, sticky=W) 
     self.textdisp09.grid(row=10, column=1, sticky=W) 
     self.textdisp10.grid(row=11, column=1, sticky=W) 


     self.updatewig() 

    def updatewig(self): 
     ## Change content of the labels using 'config' 
     self.user_input.set("") 
     self.textdisp00.config(text = window.cache[0]) 
     self.textdisp01.config(text = window.cache[1]) 
     self.textdisp02.config(text = window.cache[2]) 
     self.textdisp03.config(text = window.cache[3]) 
     self.textdisp04.config(text = window.cache[4]) 
     self.textdisp05.config(text = window.cache[5]) 
     self.textdisp06.config(text = window.cache[6]) 
     self.textdisp07.config(text = window.cache[7]) 
     self.textdisp08.config(text = window.cache[8]) 
     self.textdisp09.config(text = window.cache[9]) 
     self.textdisp10.config(text = window.cache[10]) 
     self.grid() 

    def send(self, *args): ## Pressing the return key throws an error, so added '*args' to make it work 
     #self.textdisp.withdraw() 
     try: 
      self.char_check = str(self.user_input.get())[0] 
     except: 
      pass 
     print(self.char_check) 
     self.command = self.user_input.get() 
     if self.char_check == "/": 
      window.cache.append(self.user_input.get()) 
      del window.cache[0] 
      self.user_input.set("") 
      self.function() 
     else: 
      try: 
       #send 
       window.cache.append(("Me> "+self.user_input.get())) 
       del window.cache[0] 
      except: 
       print("Message could not be sent") 
      print(window.cache) 
      self.updatewig() 
    def function(self): 
    # One long if statement to define all the commands 
     if self.command == "/host": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/join": 
      window.cache.append(("Enter IP:")) 
      window.con_ip = self.user_input.get() 
      del window.cache[0] 
      window.cache.append(("Enter Port:")) 
      window.con_port = self.user_input.get() 
      del window.cache[0] 
      window.cache.append(("Enter alias:")) 
      window.alias = self.user_input.get() 
      del window.cache[0] 
     elif self.command == "/changealias": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/close": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/ban": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/encodeon": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/encodeoff": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/commands": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/mysettings": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 
     elif self.command == "/reset": 
      window.cache.append(("This command is not yet available.")) 
      del window.cache[0] 

FRAME = tkframe(window) 
window.mainloop() 

  1. Returnキーが押されたときsend方法は、余分な引数についてのエラーを投げていましたそこで私は*argsをパラメータとして追加しました。今すぐそれはReturnキーと[送信]ボタンの両方で動作するはずです。
  2. Textウィジェットを使用して、NormalDisableの状態のLabelの代わりに使用することは、おそらくより簡単です(さらに良いでしょう)。私はあなたがラベルを使用している理由を知らないので、私は答えにそれを使用しませんでした。
+0

私は単にファッションのようにリストにテキストを表示するためにラベルを使用していました。最新のメッセージは最下部にあり、残りは1行上にバンプされます。あなたがテキストを表示するためのより良い方法を知っていれば、私はそれを高く評価します – IronReign

関連する問題