1

ここに問題があります。私は少しの間Pythonを使い始めましたが、問題に遭遇しました。最初は基本的なことのように思えるかもしれませんが、私は何時間も忙しくしていました。* プログラムの実行時に構文エラーは表示されませんが、プログラムは新しい IP をファイルに書き込めません。

サーバー(私のIP)は現在静的ではないため、クライアントに新しいIPアドレスを要求するプログラムの機能を作成しています。私の IP は頻繁に変更されるため、(私との接続を確立しようとしている) クライアントに、接続しようとしている IP を変更するオプションを提供したいと考えています。

だからここに関数があります:

#CONFIGURE NEW IP
def IpConfigNew():
   #Creates new window 
   IpConfig = Tk()
   IpConfig.configure(background = 'white')
   IpConfig.title('Configure IP')
   IpConfig.geometry('300x60+260+380')
   IpNew = StringVar()
   Label(IpConfig, font  = ('Helvetica',12), text = 'Please enter the IP address of the   server', bg = 'white').place(x=0,y=4)
   #Creates box for user to type IP in.
   Entry(IpConfig,textvariable=IpNew, bg = "light blue").place(x=4,y=35)

 #Store New Ip NOTE that it is nested within IpConfigNew
 def IpStore():
     #Retrieves new IP from text box and stores it in variable 
     GetIpNew = IpNew.get()
     mypath = str('Latest Server')
     #Creates directory to write new IP to.
     if not os.path.isdir(mypath):
         os.makedirs(mypath)
     StoreLatestServer = open('Latest Server\NewIp.txt', 'w')
     #Writes new IP
     StoreLatestServer.write("%s"%(GetIpNew))
     StoreLatestServer.close()
     IpConfig.destroy()#Closes window

   #Calls on function IpStore in order to store the new IP    
   Button(IpConfig,text = 'Done', command = IpStore).place(x=150,y=30)
   IpConfig.mainloop()

def PromptIpReconfig():
  confirm = tkMessageBox.askyesno(title = "Configure Server IP", message = "Are you   sure?")
#Checks to see if the user chose to change IP
if confirm >0: 
  #In the event that the user said yes go to IpConfigNew
  IpConfigNew()
else:
   return

#Configure Menu Bar #Sets up Menu Bar for parent Window(app)
menubar = Menu(app)
filemenu = Menu(menubar,tearoff = 0)
# Goes to     PromptIpReconfig (Prompts user to Reconfigure the IP after clicking button)
filemenu.add_command(label="Configure IP", command = PromptIpReconfig) 
filemenu.add_command(label="Quit", command=app.destroy)
menubar.add_cascade(label='Options',menu = filemenu)
app.config(menu=menubar)#Draws menubar on parent window(app)

以前にこれを行ったので、なぜ機能しないのかはわかりませんが、少し異なると予想されます。新しい IP をファイルに書き込もうとすると、ファイルに何も書き込まれません。新しいディレクトリが作成されたので、機能が働いていることがわかります。少し前に作ったプログラムとこの作品を対比させてみました。私が見つけたのは、これを行うとうまくいくということでした:

#CONFIGURE NEW IP
#Creates new window
IpConfig = Tk()
IpConfig.configure(background = 'white')
IpConfig.title('Configure IP')
IpConfig.geometry('300x60+260+380')
IpNew = StringVar()
Label(IpConfig, font  = ('Helvetica',12), text = 'Please enter the IP address of the   server', bg = 'white').place(x=0,y=4)
#Creates box for user to type IP in.
Entry(IpConfig,textvariable=IpNew, bg = "light blue").place(x=4,y=35)

 #Store New Ip
 def IpStore():
     #Retrieves new IP from text box and stores it in variable GetIpNew
     GetIpNew = IpNew.get()
     mypath = str('Latest Server')
     #Creates directory to write new IP to.
     if not os.path.isdir(mypath):
         os.makedirs(mypath)
     StoreLatestServer = open('Latest Server\NewIp.txt', 'w')
     #Writes new IP
     StoreLatestServer.write("%s"%(GetIpNew))
     StoreLatestServer.close()
     #Closes window
     IpConfig.destroy()

#Calls on function IpStore in order to store the new IP
Button(IpConfig,text = 'Done', command = IpStore).place(x=150,y=30)
IpConfig.mainloop()

メニューバーを使用せずに開始し、代わりにプログラムの開始時に開始すると、正常に動作することがわかりました。問題がメニュー バーから IpConfigNew 関数を呼び出しているのか、それとも関数をネストしているという事実と関係があるのか​​はわかりません。

何日も悩まされていたので、誰かがここで私を助けてくれたら嬉しいです!

4

2 に答える 2

0

プログラムのレイアウトを事前に明確にしていませんでした。今から説明してみます。

私が持っているのはメインウィンドウで、メインウィンドウ(「アプリ」と呼ばれる)内にメニューバーを設定しました。このメニュー バーには、「オプション」と呼ばれるカスケードと、「PromptIpReconfig」と呼ばれるコマンドがあります。

app = Tk() 
filemenu.add_command(label="Configure IP", command = PromptIpReconfig)
filemenu.add_command(label="Quit", command=app.destroy)
menubar.add_cascade(label='Options',menu = filemenu)

関数「PromptIpReconfig」を呼び出すと、次のことが起こります。

def PromptIpReconfig():
   confirm = tkMessageBox.askyesno(title = "Configure Server IP", message = "Are you sure?")
   if confirm >0:
      IpConfigNew()
   else:
      return

ユーザーが「はい」と答えると、次のようIpConfigNew()に呼び出されます。

#CONFIGURE NEW IP
def IpConfigNew():
    IpConfig = Tk()
    IpConfig.configure(background = 'white')
    IpConfig.title('Configure IP')
    IpConfig.geometry('300x60+260+380')
    IpNew = StringVar()
    Label(IpConfig, font  = ('Helvetica',12), text = 'Please enter the IP address of the server', bg = 'white').place(x=0,y=4)
    Entry(IpConfig,textvariable=IpNew, bg = "light blue").place(x=4,y=35)

    #Store New Ip
    def IpStore():
        GetIpNew = IpNew.get()
        mypath = str('Latest Server')
        if not os.path.isdir(mypath):
            os.makedirs(mypath)
        StoreLatestServer = open('Latest Server\NewIp.txt', 'w')
        StoreLatestServer.write("%s"%(GetIpNew))
        StoreLatestServer.close()
        IpConfig.destroy()

    Button(IpConfig,text = 'Done', command = IpStore).place(x=150,y=30)
    IpConfig.mainloop()

IpConfigNew はIpConfig = Tk()、メイン ウィンドウ内に子ウィンドウを開きます。子ウィンドウには、新しい IP を入力した後にクリックするボタンがあります。ボタンをクリックすると、コマンド「IpStore」が呼び出されます。

#Store New Ip
def IpStore():
    GetIpNew = IpNew.get()
    mypath = str('Latest Server')
    if not os.path.isdir(mypath):
        os.makedirs(mypath)
    StoreLatestServer = open('Latest Server\NewIp.txt', 'w')
    StoreLatestServer.write("%s"%(GetIpNew))
    StoreLatestServer.close()
    IpConfig.destroy()

したがって、基本的に私のプログラムの全体的なレイアウトは次のようになります。

from Tkinter import *
import os
import tkMessageBox
#Create parent window
app = Tk()

def IpConfigNew():
   #Creates new window 
   IpConfig = Tk()
   IpNew = StringVar()
   Label(IpConfig, font  = ('Helvetica',12), text = 'Please enter the IP address of the   server', bg = 'white').place(x=0,y=4)
   #Creates box for user to type IP in.
   Entry(IpConfig,textvariable=IpNew, bg = "light blue").place(x=4,y=35)

 #Store New Ip NOTE that it is nested within IpConfigNew
 def IpStore():
     #Retrieves new IP from text box and stores it in variable 
     GetIpNew = IpNew.get()
     mypath = str('Latest Server')
     #Creates directory to write new IP to.
     if not os.path.isdir(mypath):
         os.makedirs(mypath)
     StoreLatestServer = open('Latest Server\NewIp.txt', 'w')
     #Writes new IP
     StoreLatestServer.write("%s"%(GetIpNew))
     StoreLatestServer.close()
     IpConfig.destroy()#Closes window

   #Calls on function IpStore in order to store the new IP    
   Button(IpConfig,text = 'Done', command = IpStore).place(x=150,y=30)
   IpConfig.mainloop()

def PromptIpReconfig():
   confirm = tkMessageBox.askyesno(title = "Configure Server IP", message = "Are you sure?")
   if confirm >0:
      #In the case that the user says yes
      IpConfigNew()
   else:
      return


#Create menu bar
filemenu.add_command(label="Configure IP", command = PromptIpReconfig)
filemenu.add_command(label="Quit", command=app.destroy)
menubar.add_cascade(label='Options',menu = filemenu)

app.mainloop()

これは機能しているように見えるので、問題は関数 IpConfigNew であると確信しています。

from Tkinter import *
import tkMessageBox
import os


#Creates new window   
IpConfig = Tk()
IpNew = StringVar()
Label(IpConfig, font  = ('Helvetica',12), text = 'Please enter the IP address of the   server', bg = 'white').place(x=0,y=4)
#Creates box for user to type IP in.
Entry(IpConfig,textvariable=IpNew, bg = "light blue").place(x=4,y=35)

#Store New Ip NOTE that it is nested within IpConfigNew
def IpStore():
     #Retrieves new IP from text box and stores it in variable 
     GetIpNew = IpNew.get()
     mypath = str('Latest Server')
     #Creates directory to write new IP to.
     if not os.path.isdir(mypath):
         os.makedirs(mypath)
     StoreLatestServer = open('Latest Server\NewIp.txt', 'w')
     #Writes new IP
     StoreLatestServer.write("%s"%(GetIpNew))
     StoreLatestServer.close()
     IpConfig.destroy()#Closes window

#Calls on function IpStore in order to store the new IP    
Button(IpConfig,text = 'Done', command = IpStore).place(x=150,y=30)
IpConfig.mainloop()

これにより、私が扱っていることをより明確に理解できるはずです。ありがとう

于 2013-10-02T09:54:55.253 に答える