gpt4 book ai didi

python - python:如何避开变量变量

转载 作者:行者123 更新时间:2023-12-01 06:06:12 25 4
gpt4 key购买 nike

由于python是我的第一种面向对象语言,因此我无法理解。
我需要运行一个对话框,并将返回值放入从另一个函数传递的变量中。
在这种情况下,如何在dGetPath中解决变量变量?

def dGetPath(self, widget, data=None):
print "%s needs to be filled with output from a dialog here" % (data)

def dupChk(self, widget, data=None):
print "if I figure out dGetPath... %s should be easy" % (data)

def __init__(self):
self.mainwin = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.mainwin.set_position(gtk.WIN_POS_CENTER)
# ...
self.Apath = gtk.Button("A in path")
self.Apath.connect("clicked", self.dGetPath, "Apath")

self.Aopath = gtk.Button("A out path")
self.Aopath.connect("clicked", self.dGetPath, "Aopath")

self.dupchkA = gtk.Button("Dupe check A") # check A path for duplicates
self.dupchkA.connect("clicked", self.dupChk, "dupchkA")
self.dupchkA.set_tooltip_text("check A path for duplicates using MD5 sum")

self.Bpath = gtk.Button("B in path")
self.Bpath.connect("clicked", self.dGetPath, "Bpath")

self.Bopath = gtk.Button("B out path")
self.Bopath.connect("clicked", self.dGetPath, "Bopath")

self.dupchkB = gtk.Button("Dupe check B") # check B path for duplicates
self.dupchkB.connect("clicked", self.dupChk, "dupchkB")
self.dupchkA.set_tooltip_text("check B path for duplicates using MD5 sum")
# ...

最佳答案

如果我正确阅读了您的问题,您会对event handlingcallback functions感到困惑-当用户使用对话框(尚未定义...)返回的值时,您需要做一些事情(dupChk())点击Apath

我认为您在这里缺少的地方是存储filechooserself.APath?)选择的文件或目录的地方-并且需要在单击按钮时生成filechooser对话框。

但是您的Apath按钮尚不知道路径,因此您无法为其提供在路径上起作用的回调函数。你可以:


提供一个回调函数,该函数可以打开文件选择器的对话框,然后在结果上调用dupChk()函数。
通过其他某种机制(另一个按钮?是否始终打开窗口中嵌入的文本?适合输入的文本字段?)使文件选择器可用,并重新标记Apath按钮“检查重复项”。 filechooser回调存储在self.Apath中,而按钮回调调用dupChk(self.Apath)




更新资料

同时学习GUI编程和OO编程可能是一个很大的障碍,但是GUI窗口小部件的类层次结构非常适合于面向对象的设计,并且这个项目看起来像是一个可以接近的规模,因此做得很好。

面向对象编程只是将定制类型与对这些类型的操作进行捆绑的一种方法。您创建一个Window对象以存储与窗口相关的属性以及在特定Window对象上起作用的方法。或者,您创建一个Widget对象,该对象提供所有图形小部件通用的数据-X位置,Y位置,宽度,高度,小部件是否可以在X或Y尺寸上增大或缩小,可见或不可见等;以及所有小部件共有的操作-设置X或Y的位置,宽度,高度,缩放控件,可见或不可见等。然后每个新的图形元素都从Widget基本功能继承而来,然后可以提供新数据或特定于正在制作的新型窗口小部件的操作。

为了使单个图形控件保持简单,大多数GUI编程工具包都提供了每个图形元素都可以生成或使用的事件。您提供回调-事件发生时调用的函数。大多数GUI编程环境的工作方式与“常规”编程完全不同。这种差异有时称为inversion of control。本质上,GUI工具包会设置所有内容,然后调用您提供的功能。 (您的main()或本例中的__init__()函数仅设置所有小部件和回调,然后启动一个event loop等待事件,然后调用您的回调函数。)

回调机制使您可以根据安装的回调在不同位置将相同的窗口小部件类重复用于不同的任务。一个Button可能会退出该应用程序,另一个Button可能会发射导弹或启动Web浏览器。

与Java不同,在Python中,不需要在类内完成所有操作。如果您的程序的最高级别不值得放在班级中,则不必将其放在班级中。无论如何,您可能都希望将其全部放在一个类中,因此更容易嵌入到将来的程序中,但是如果该程序只需要解决一个小任务并且不太可能被嵌入,则无需过多地使编程任务复杂化。考虑到这一点,我编写了一个小巧的演示工具,该​​工具演示了如何显示两个FileChooserButtons,如何连接到其"file-set"信号以及如何从有问题的文件选择器中获取文件名。 ,以及如何将文件选择器中的结果存储到您选择的变量中。

我认为这是您遇到最多麻烦的最后一部分-如果是C,则只需按以下方式连接您的回调:

char *filea, *fileb;
hyptothetical_widget widget = new_hypothetical_widget("foo");
hypthetical_connect(widget, &callback, &filea);


并且 &filea(或 &fileb)足以选择要更新的指针。

Python使这变得有些棘手-无法添加 &来传递指针。您可以做的是 pass an array and modify the array in the callback

我编写的小演示使用此“按引用传递”技巧,可以轻松地使用相同的回调函数将其写入两个不同的变量,具体取决于它连接到的是哪个小部件:

#!/usr/bin/python

import gtk

def pick_file(widget, filename):
filename[0] = widget.get_filename()
print filename
update_entry_boxes()

def update_entry_boxes():
ea.set_text(filea[0])
eb.set_text(fileb[0])



filea=["None Selected"]
fileb=["None Selected"]

win = gtk.Window(gtk.WINDOW_TOPLEVEL)
box = gtk.HBox();

ba = gtk.FileChooserButton("File A")
ba.connect("file-set", pick_file, filea)
bb = gtk.FileChooserButton("File B")
bb.connect("file-set", pick_file, fileb)
ea = gtk.Entry()
eb = gtk.Entry()

box.add(ba)
box.add(ea)
box.add(bb)
box.add(eb)

update_entry_boxes()

win.add(box)
win.show_all()

gtk.main()


我希望这是有帮助的。

关于python - python:如何避开变量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com