无法在python中的另一个函数中识别main中的全局变量
下面的代码创建布局并在布局中显示一些文本。接下来,使用urwid库中的原始显示模块在控制台屏幕上显示布局。但是,运行代码失败,因为在main中声明的全局变量ui在另一个函数中无法识别 运行时的错误代码为:无法在python中的另一个函数中识别main中的全局变量,python,user-interface,python-2.7,console-application,urwid,Python,User Interface,Python 2.7,Console Application,Urwid,下面的代码创建布局并在布局中显示一些文本。接下来,使用urwid库中的原始显示模块在控制台屏幕上显示布局。但是,运行代码失败,因为在main中声明的全局变量ui在另一个函数中无法识别 运行时的错误代码为: 回溯(最近一次呼叫最后一次): 文件“/yamlUrwidUIPhase6.py”,第97行,在 main() 文件“/yamlUrwidUIPhase6.py”,第90行,主文件 form=FormDisplay() 文件“/yamlUrwidUIPhase6.py”,第23行,在 调色板
回溯(最近一次呼叫最后一次):
文件“/yamlUrwidUIPhase6.py”,第97行,在
main()
文件“/yamlUrwidUIPhase6.py”,第90行,主文件
form=FormDisplay()
文件“/yamlUrwidUIPhase6.py”,第23行,在
调色板=用户界面。注册调色板([
NameError:未定义全局名称“ui”
守则:
import sys
sys.path.append('./lib')
import os
from pprint import pprint
import random
import urwid
global ui
class FormDisplay(object):
def __init__(self):
self.ui = urwid.raw_display.Screen()
palette = ui.register_palette([
('Field', 'dark green, bold', 'black'), # information fields, Search: etc.
('Info', 'dark green', 'black'), # information in fields
('Bg', 'black', 'black'), # screen background
('InfoFooterText', 'white', 'dark blue'), # footer text
('InfoFooterHotkey', 'dark cyan, bold', 'dark blue'), # hotkeys in footer text
('InfoFooter', 'black', 'dark blue'), # footer background
('InfoHeaderText', 'white, bold', 'dark blue'), # header text
('InfoHeader', 'black', 'dark blue'), # header background
('BigText', RandomColor(), 'black'), # main menu banner text
('GeneralInfo', 'brown', 'black'), # main menu text
('LastModifiedField', 'dark cyan, bold', 'black'), # Last modified:
('LastModifiedDate', 'dark cyan', 'black'), # info in Last modified:
('PopupMessageText', 'black', 'dark cyan'), # popup message text
('PopupMessageBg', 'black', 'dark cyan'), # popup message background
('SearchBoxHeaderText', 'light gray, bold', 'dark cyan'), # field names in the search box
('SearchBoxHeaderBg', 'black', 'dark cyan'), # field name background in the search box
('OnFocusBg', 'white', 'dark magenta') # background when a widget is focused
])
urwid.set_encoding('utf8')
def main(self):
#self.view = ui.run_wrapper(formLayout)
self.view = formLayout()
self.ui.start()
self.loop = urwid.MainLoop(self.view, self.palette, unhandled_input=self.unhandled_input)
self.loop.run()
def unhandled_input(self, key):
if key == 'f8':
quit()
return
def formLayout():
text1 = urwid.Text("Urwid 3DS Application program - F8 exits.")
text2 = urwid.Text("One mission accomplished")
textH = urwid.Text("topmost Pile text")
cols = urwid.Columns([text1,text2])
pile = urwid.Pile([textH,cols])
fill = urwid.Filler(pile)
textT = urwid.Text("Display")
textSH = urwid.Text("Pile text in Frame")
textF = urwid.Text("Good progress !")
frame = urwid.Frame(fill,header=urwid.Pile([textT,textSH]),footer=textF)
dim = ui.get_cols_rows()
ui.draw_screen(dim, frame.render(dim, True))
return
def RandomColor():
'''Pick a random color for the main menu text'''
listOfColors = ['dark red', 'dark green', 'brown', 'dark blue',
'dark magenta', 'dark cyan', 'light gray',
'dark gray', 'light red', 'light green', 'yellow',
'light blue', 'light magenta', 'light cyan', 'default']
color = listOfColors[random.randint(0, 14)]
return color
def main():
form = FormDisplay()
form.main()
########################################
##### MAIN ENTRY POINT
########################################
if __name__ == '__main__':
main()
我不想更改函数formLayout,因为我打算在这个基本代码框架中添加更多内容,其中将添加另一个函数,该函数反复调用formLayout,根据从yml文件读取的值不断更新屏幕。在
main
中写入全局ui
除了使main
本身可以写入名为ui
的全局变量。如果要从其他函数(如\uuuuu init\uuuu
)写入该全局变量,您还需要在其中包含一个全局
声明。您要分配给全局变量的每个函数都必须有自己的全局
声明。好的,感谢人们提出的各种建议,帮助我了解全局范围。我在这里遵循了Jeff Shannon的答案:似乎能够t消除使用全局ui导致的名称作用域错误。以下是我使用ui=urwid.raw\u display.Screen()时所做的操作在导入之后,然后在使用它的函数中声明了全局ui。但是现在我得到了另一种错误。我认为最好用现在得到的错误开始一个新问题。我使用全局ui的主要目的是因为我想要控制台屏幕的句柄(这里由urwid提供的原始显示模块表示)。这样我就可以编写几个函数来创建顶级box小部件,然后向box小部件添加更多的子小部件,从而可以写入/修改屏幕。如果我对每个函数都有一个全局ui声明,那么函数调用会反映全局控制台屏幕中的更改吗?@tauseef_india:是的,如果使用全局ui
在每个使用ui
的函数中,至少所有这些函数都能够写入该变量。我不知道uiwid
是如何工作的,所以我不能说这是否意味着它将实际工作并执行您希望它执行的操作,但至少不会出现这些名称未定义
问题。在每个函数中声明全局ui在使用ui的函数中,仍然不起作用:-(它显示了与上面堆栈跟踪中给出的类似的错误消息。我试图在上面的另一个答案中包含Jonathan的建议,但这也不起作用。现在代码更改后出现属性错误。新问题位于[请注意我在原始线程中所做的更改,此外,您是否可以发布抛出堆栈跟踪的代码。您还需要在任何函数或类之外声明ui
,以使global ui
声明生效。@Jonathan我在导入之后放置了global ui,但仍然不起作用。我应该这样做吗用我的当前代码和错误消息开始一个新问题?因为我不知道如何将正确缩进的代码放在这里的逗号框中。@Ketouem我将代码移到这里,让我们在这里讨论。将您的更改合并到代码中。打印错误消息的新跟踪。仍然没有work@Jonathan更新代码(如上)使全局ui在导入后立即出现。仍然不起作用。给出了最新的堆栈跟踪。