私信  •  关注

abarnert

abarnert 最近创建的主题
abarnert 最近回复了
6 年前
回复了 abarnert 创建的主题 » 在python中为对象中的多个变量赋值

将某个东西重构为函数的最简单方法是找出需要传递的值以及需要返回的值:

def spendattr(name, value, points):
    spent = int(input(f"\nType in your {name}: ")
    if points > 0:
        value = value + spent
        points = points - spent
    print("Points remaining: ", points)
    return value, points

然后通常称之为一行:

while points > 0:
    optio.health, points = spendattr('Health', optio.health, points)
    optio.strength, points = spendattr('Strength', optio.strength, points)
    … etc.

现在,无论你需要改进什么,都应该更容易改进,因为你只需要在一个地方而不是在四个地方写。

还有一点重复你必须打字 health 两次和 Health 一次,等等,但不足以引起复制粘贴错误。


如果你想消除这一点,我认为建立一个值的dict,然后用这个dict构造player对象会更容易。

假设您使用的是python 3.7+或cpython 3.6,那么我们可以依赖所订购的dict:

def spendattr(name, attrs, points):
    spent = int(input(f"\nType in your {name.title()}: ")
    if points > 0:
        attts[name] = attrs[name] + spent
        points = points - spent
    print("Points remaining: ", points)
    return points

attrs = {'health':0, 'strength':0, …}
while points > 0:
    for attr in attrs:
        points = spendattr(name, attrs, points)
player = Player(name=playername, **attrs)
6 年前
回复了 abarnert 创建的主题 » frame.quit在python中的用法

你说得对,你必须给班级命名 tkinter.Frame 而不是仅仅 Frame

你也是对的,这不会解决任何问题。

因为根本问题是需要在 框架 实例 ,不是在 框架

幸运的是,您已经准备好了 框架 实例,从这行:

    top_Frame = tkinter.Frame(welk_window, width = "1", height = "1") 

因此,您可以使用它:

    self.Button_quit = tkinter.Button(top_Frame, text = "Quit", fg ="red", 
                                      command=top_Frame.quit)

但是,值得考虑一点重新设计。

通常,当您为tkinter创建类时,您希望使对象直接成为小部件,或者成为小部件的控制器。你的 Main_Frame 对象只是在初始化时创建一个框架小部件,然后忘记它,所以实际上两者都不是。


使 主框架 成为一个框架,只是继承自 框架 和使用 self 你会用到的任何地方 top_Frame :

class Main_Frame(tkinter.Frame):

    def __init__(self, welk_window):
        super().__init__(welk_window, width = "1", height = "1") 
        self.pack()

        self.Button_start = tkinter.Button(self, text = "Start", fg ="green", command=self.startMessage)
        self.Button_start.pack(side=tkinter.LEFT)

        self.Button_quit = tkinter.Button(self, text = "Quit", fg ="red", command=self.quit)
        self.Button_quit.pack(side=tkinter.LEFT)

    def startMessage(self):
        print("Start")

要使其成为帧控制器,只需存储 顶部框架 作为一个属性,使用相同的方法 Button_start :

class Main_Frame:

    def __init__(self, welk_window):
        self.top_Frame = tkinter.Frame(welk_window, width = "1", height = "1") 
        self.top_Frame.pack()

        self.Button_start = tkinter.Button(top_Frame, text = "Start", fg ="green", command=self.startMessage)
        self.Button_start.pack(side=tkinter.LEFT)

        self.Button_quit = tkinter.Button(top_Frame, text = "Quit", fg ="red", command=self.top_Frame.quit)
        self.Button_quit.pack(side=tkinter.LEFT)

    def startMessage(self):
        print("Start")
6 年前
回复了 abarnert 创建的主题 » 尝试从python运行javascript

首先,你使用的是图书馆, PyExecJS 它声称不再需要维护,而且设计也很差。

所以,这可能不是最好的选择。


第二,你用错了。

这些示例都包括将JS代码作为字符串传递给 execjs.eval execjs.compile .

您试图直接在内联中包含JS代码,就好像它是Python代码一样。这不会奏效;它将尝试将JS代码解析为python并引发 SyntaxError 因为他们不是同一种语言。

所以,你必须做与例子相同的事情。可能看起来像这样:

import execjs

jscode = """
    var request = require('request');

    var apiHostName='https:/url.com';

    emailAddress = 'my.email@company.com'
    apiKey = 'api_key'

    function callback(error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log("Identity with email address " + emailAddress + " found:");
        var b= JSON.parse(body);
        console.log("id="+b.identityId+",api key="+b.apiKey+",type="+b.type);
      } else{
        if (response.statusCode == 401) {
          console.log ("Couldn't recognize api key="+apiKey);
        } else if (response.statusCode == 403) {
          console.log ("Operation forbidden for api key="+apiKey);
        } else if (response.statusCode == 404) {
          console.log ("Email address " +emailAddress + " not found");
        }
      }
    }
"""
execjs.eval(jscode)

或者,也许更好,将javascript移动到单独的 .js 文件,然后按如下方式运行:

import os.path
import execjs

dir = os.path.dirname(__file__)
with open(os.path.join(dir, 'myscript.js')) as f:
    jscode = f.read()
execjs.eval(jscode)

1。某人 能够 为python编写一个导入钩子,该钩子执行类似于perl的操作 Inline::Python , Inline::Java 对于python,允许您将其他语言的代码直接嵌入到python脚本中。有时,有人确实试图写这样的东西,但他们似乎总是在它还没有准备好生产之前就把它当作一个坏主意放弃,或者重新设计它使之更像 派克塞克斯 .

req = urllib.request.urlretrieve(queryURL, params)
urllib.request.urlopen(req)

urlretrieve (filename, headers)

urlopen Request

response = urllib.request.urlopen(queryURL, params)

jsonResult = json.load(response) NameError response


urlencode

TypeError

Content-Type


urllib.request

Requests package

queryURL = "https://hazards.fema.gov/gis/nfhl/rest/services/CSLF/Prelim_CSLF/MapServer/3/query"
params = {'f': 'json', 'geometryType': 'esriGeometryPolygon', 'outFields': 'OBJECTID, SHAPE, CSLF_ID, Area_SF', 'returnGeometry': 'false'}
jsonResult = requests.post(queryURL, data=params).json()