我目前正在尝试使用Tkinter构建战舰游戏。 但是,我不知所措,因为我无法使程序正确地“等待”答案并显示Tkinter窗口。 我的想法是,每当按下提交按钮时,值就会设置为true。 只要该值为假,程序就将循环进行while循环。 当触发该值时,将给出下一组操作,并将该值设置回false,然后再次等待它为true。 这是代码:

from Tkinter import *

import time


class Application(Frame):

    def __init__(self,master):
        self.user = False
        Frame.__init__(self,master)
        self.launch()
        self.master = master
        self.shiplist = []

        self.board = [
        ["A",1],["B",1],["C",1],["D",1],["E",1],["F",1],["G",1],["H",1],["I",1],["J",1],
        ["A",2],["B",2],["C",2],["D",2],["E",2],["F",2],["G",2],["H",2],["I",2],["J",2],
        ["A",3],["B",3],["C",3],["D",3],["E",3],["F",3],["G",3],["H",3],["I",3],["J",3],
        ["A",4],["B",4],["C",4],["D",4],["E",4],["F",4],["G",4],["H",4],["I",4],["J",4],
        ["A",5],["B",5],["C",5],["D",5],["E",5],["F",5],["G",5],["H",5],["I",5],["J",5],
        ["A",6],["B",6],["C",6],["D",6],["E",6],["F",6],["G",6],["H",6],["I",6],["J",6],
        ["A",7],["B",7],["C",7],["D",7],["E",7],["F",7],["G",7],["H",7],["I",7],["J",7],
        ["A",8],["B",8],["C",8],["D",8],["E",8],["F",8],["G",8],["H",8],["I",8],["J",8],
        ["A",9],["B",9],["C",9],["D",9],["E",9],["F",9],["G",9],["H",9],["I",9],["J",9],
        ["A",10],["B",10],["C",10],["D",10],["E",10],["F",10],["G",10],["H",10],["I",10],["J",10],
        ]
        self.letters = [["A",1],["B",2],["C",3],["D",4],["E",5],["F",6],["G",7],["H",8],["I",9],["J",10]]
    def launch(self):
        self.pack(fill=BOTH, expand=1)

        Label(self, text="Your Board").grid(sticky=W,row = 0, column = 0)
        Label(self, text="Enemy Board").grid(sticky=W, row = 0,column = 2)

        canvas1 = Canvas(self)
        canvas1.create_rectangle(2,2,250,250,outline= "black",fill = "white")
        canvas1.grid(row=1, column=0, columnspan=2, rowspan=2)

        canvas2 = Canvas(self)
        canvas2.create_rectangle(2,2,250,250,outline= "black",fill = "white")
        canvas2.grid(row=1, column=2, columnspan=2, rowspan=2)

        self.actionLabel = Label(self,text = "Currently Placing:")
        self.actionLabel.grid(row = 3,column= 0,sticky = W)

        self.infoLabel1 = Label(self,text ="")
        self.infoLabel1.grid(row = 4,column = 0)

        self.infoLabel2 = Label(self,text = "")
        self.infoLabel2.grid(row=5,column=0)

        self.userinput = Entry(self,text = "Write here")
        self.userinput.grid(row=6,column=0)

        Button(self,text = "Submit",command = self.action).grid(row = 6,column = 1,sticky = W)

        self.errorlabel = Label(self,text = "")
        self.errorlabel.grid(row=7,column=0)
        self.request_ships()
    def action(self):
        value = self.userinput.get()
        self.user = True
        print "action successful"
    def request_ship(self,allegiance,name,size):
        print allegiance,name,size
        ship = [name,size]
        error = False
        if allegiance == "player":
            print "here"
            while error == False:
                self.user = False
                text1 =  name + "Size: "+ str(size) + " cells."
                self.infoLabel1.configure(text = text1)
                self.infoLabel2.configure(text = "Would you like for your ship to be vertical or horizontal? v/h:")
                if self.user == True:    
                    if value != "vertical" and value != "horizontal" and value != "h" and value != "v":
                        self.errorlabel.configure(text = "Error! Incorrect Format!")
                        error = False
                    else:
                        self.user = False
                        if value == "h":
                            ship += value
                            self.infoLabel2.configure(text = "Please enter the leftmost coordinate of where you want to place your ship:")
                            if self.user== True:
                                if len(value) > 1 and len(value) <= 3 and (value[0] == "A"
                                or value[0] == "B" or value[0] == "C" or value[0] == "D"
                                or value[0] == "E" or value[0] == "F" or value[0] == "G"
                                or value[0] == "H" or value[0] == "I" or value[0] == "J") and (value[1] == "1"
                                or value[1] == "2" or value[1] == "3" or value[1] == "4"
                                or value[1] == "5" or value[1] == "6" or value[1] == "7"
                                or value[1] == "8" or value[1] == "9" or value[1] == "10"):
                                    for i in range(len(self.board)):
                                        if self.board[i][0] == value[0] and self.board[i][0] == value[1:]:
                                            num = 0
                                            for i in size:
                                                coord+= i + num
                                                num += 1
        print ship
    def request_ships(self):
        print "request ships works"
        self.request_ship("player","Aircraft Carrier",5)

    def grid(self,gridinfo,shipinfo):
        coord = 0
        cellnum = 0
        for number in range(100):

            cell = Canvas(self)
            for ship in shipinfo:
               ## if #####
                print "tt"
            cell.create_rectangle(coord,coord,25,25,outline="black",fill=color)

def main():

    root = Tk()
    app = Application(root)
    app.geometry = ("1000x1000")
    root.title("Battleship")
    root.mainloop()



main()

但是,问题在于,当request_ships函数加载时,该窗口永远不会出现,因为它在while循环中不断循环。 有关如何解决此问题的任何提示?

===============>>#1 票数:1 已采纳

需要研究的一些事情: while error == False ,但是循环中对error的唯一引用是为其分配False 在循环中,您分配self.user = False ,但是if self.user == True ,那么循环中的几乎所有内容都取决于进入。 您将self.userinput.get()分配给局部变量value而不是实例变量。 您应该更多地使用in运算符,以避免进行数十次单独的比较。 您只在if self.user == True内的大if语句中检查value[1] 除了检查值等于True还是False ,您还可以引用该值,例如, if self.user:因为另一种表示True == True方法就是True (除非该变量具有不确定的类型,并且您确实需要检查它是True还是非空字符串)。 您正在检查“ Entry框中的内容,然后才真正准备好-您应将request_ships()放入某些Button的命令中,或者至少使用after()等待一秒钟。 您正在检查self.board[i][0]是否等于value[0]value[1] ,这仅在用户输入诸如AA无效内容时才为true。 如果我们修复此问题以同时检查self.board[i][1] ,它仍然无法正常工作,因为Entry小部件中的所有内容都是字符串,必须将其转换为int 您不能将字符串连接到list ,请使用append() 从一个功能中依次检查垂直/水平,位置等都会遇到问题,因为您不必等待用户输入其他值。

这是request_ship()的示例,其中实现了一些更改,因此您可以了解该去哪里:

def request_ship(self,allegiance,name,size):
    print allegiance,name,size
    ship = [name,size]
    error = True
    if allegiance == "player":
        print "here"
        text1 =  name + "Size: "+ str(size) + " cells."
        self.infoLabel1.configure(text = text1)
        self.infoLabel2.configure(text = "Would you like for your ship to be vertical or horizontal? v/h:")
        if self.user:    
            if self.value not in ("vertical", "horizontal", "h", "v"):
                self.errorlabel.configure(text = "Error! Incorrect Format!")
            else:
                self.user = False
                if self.value == "h":
                    ship.append(self.value)
                    self.infoLabel2.configure(text = "Please enter the leftmost coordinate of where you want to place your ship:")
                    if self.user:
                        try:
                            v1 = int(self.value[1:])
                        except ValueError:
                            pass
                        if 1 < len(self.value) <= 3 and (self.value[0] in "ABCDEFGHIJ") and (v1 in range(1,11)):
                            for i in range(len(self.board)):
                                if self.board[i][0] == self.value[0] and self.board[i][1] == v1:
                                    num = 0
                                    for i in size:
                                        coord+= i + num
                                        num += 1
            self.user = False

请注意,以上代码既不完整也不是直接替代,以使您的程序正常运行。 您的代码将需要进行认真的重组,以处理作为GUI程序还是命令行程序的问题。

  ask by Devilius translate from so

未解决问题?本站智能推荐:

2回复

python(and or)中逻辑语句的组合

我目前正在tkinter中制作石头,纸,剪刀射击游戏,并且正在尝试编写确定谁获胜的功能。 1 =石头,2 =纸,3 =剪刀。 该脚本不打印任何内容,除非comp == 2且choice == 1。
1回复

滚动到Tkinter中的文本

大家好,我有一个文本框,我在其中搜索字符串并突出显示它们,效果很好。 问题是测试框很长,用户可能需要滚动几分钟才能找到突出显示的字符串。 我正在寻找一种设置滚动条位置的方法,以使突出显示的字符串的首次出现在顶部。 我希望这是我的突出显示功能。 我认为这将与
1回复

Python-应用逻辑

我正在制作具有GUI和某些类的应用程序。 我遇到了一个了解逻辑的问题。 这是该程序的简要说明: 结构:3个模块模块1- dataPreparation.py-负责字符串处理-由多个类和方法组成,这些类和方法接收PATH到目录,将所有文件收集在LIST中,然后根据文件名的类型对每个文
1回复

不知道为什么标签不使用tkinter更新

我是python的初学者,并尝试使用它的GUI为学校程序创建一个简单的登录系统。 我做得很好,因为我是python(和一般编码)的初学者,并且我试图学习与tkinter一起工作。 我已经弄清楚了一切,除了当用户“ access = True ”时试图使程序更改标签文本时。 这是
1回复

在主应用程序类之外获取tkinter小部件值?

我有一个pygame项目,它有一个主菜单-在所说的菜单中,我有它,因此单击“ 选项”按钮时,它会触发Tkinter UI的打开。 用户界面具有一个OptionMenu小部件,可影响游戏速度。 如何在我用来创建Tkinter窗口的类之外检索OptionMenu的值 这是一个简化的问题:
1回复

python 3.6.1,Tkinter中的无限拉长的窗口

我正在制作一个具有各种方程式的医疗计算器。 这有一个小的菜单,用户可以从一个菜单转换为另一个菜单。 但是,当我对此进行测试时,我发现GU​​I窗口越来越长,而不会破坏预先创建的F框架。 我不知道发生了什么 你能解释这个问题吗? 谢谢。 这是缩写代码。 我故意为每个方程
1回复

Python / Tkinter-如何创建窗口的无限副本?

我想制作一个不断创建的窗口,制作自己的许多副本。 我试图做一个无限循环,每次都调用该函数,但这是行不通的。 我也尝试在函数中创建一个窗口,但是在关闭旧窗口后,它只是重新创建了窗口。 这是否意味着该窗口不能被复制? 有人可以告诉我如何在不对整个新块进行硬编码的情况下复制窗口,例如
1回复

如何使窗口状态空闲直到在python tkinter中按下按钮?

我有一个带有开始按钮的窗口,并在不同的框架中设置了一些小部件。现在,我想使窗口处于空闲状态(禁用状态),直到单击“开始”按钮。帮助我解决此问题。我的代码如下
1回复

扫雷器中的Python逻辑

我目前正在写扫雷游戏。 一切正常,直到我一次单击即可暴露多个图块的问题。 每当我单击某个东西时,它都不会显示地雷(应该是这样),而只会向下,向左和向右滑动。 我做到了,所以它打印了方向,并且认为向下是正确的,依此类推。我从未遇到过左边。 这是我的代码: 逻辑在单击的函数中:
1回复

在PyCharm中运行Python程序后,Tkinter窗口会自动关闭

我正在PyCharm中编写一个小型Python游戏。 我正在使用Python版本3.4的Macbook上执行此操作。 游戏会打开一个Tkinter窗口,并向其中添加一些内容。 但是,在运行游戏时,它会短暂显示并立即关闭。 我在Stackoverflow上找到了一些技巧,可以在游戏结束