我正在为 Ubuntu 开发一个 Python 应用程序,使用户无需图形驱动程序即可获得所需的分辨率。
为了做到这一点,我一直在使用xrandr
。
然而,尽管我搜索了其他有类似问题的人并尝试修复,但现在我遇到了一个问题
。这是我的代码(我是 Python 新手,这是我的第一个应用程序,所以代码对其他人来说可能非常混乱和低效 - 我还需要重新定位一些代码,但希望它是可读的):
/usr/bin/python 的 #! 导入 gtk、系统 import os, 命令 # 使我们能够使用 xrandr 类ResolutionX(gtk.Window): # 创建 ResolutionX 的实例 def __init__(self): # 构造函数 超级(ResolutionX,self)。__init__() # 设置默认窗口值 self.set_title(“ResolutionX”) 自我设置大小请求(600,200) 自我设置位置(gtk.WIN_POS_CENTER) 修复 = gtk.Fixed() # 分辨率组合框 ResComboB = gtk.combo_box_new_text() ResComboB.append_text('1024 x 768') ResComboB.append_text('1280 x 960') ResComboB.append_text('1366 x 768') ResComboB.append_text('1280 x 1024') ResComboB.append_text('1440 x 900') ResComboB.append_text('1440 x 960') ResComboB.append_text('1440 x 1080') ResComboB.append_text('1600 x 1200') ResComboB.append_text('1920 x 1080') ResComboB.append_text('1920 x 1200') ResComboB.设置活动(0) ResComboB.connect("已更改", ResComboB_changed) label = gtk.Label("分辨率:") # 应用按钮 applyBtn = gtk.Button("应用") applyBtn.set_size_request(110,29) applyBtn.connect("点击", applyBtn_on_clicked) # 将小部件添加到主窗口 修复.put(ResComboB,98,78) 修复.put(标签,30,85) 修复.put(applyBtn,470,78) 自我添加(修复) 自我连接(“destroy”,gtk.main_quit) 自我.显示全部() def ResComboB_changed(ResComboB): 字符串 = ResComboB.get_active_text() stringRes = string.replace("x", "") 回显 = “回显” stringConfig = os.popen("cvt " + stringRes).readlines() # TODO:在 /home 文件夹中创建一个隐藏目录 #创建文件[config.sh] fWrite = open('config.sh','w') # 将 xrandr 配置写入文件中,以便我们可以编辑它 打印>> fWrite,stringConfig fWrite.关闭() fRead = open('config.sh','r') # TODO:从 readString 中删除最后 4 个字符 // DONE # 从[config.sh]获取输入并根据分辨率的选择进行编辑 如果(字符串==“1024 x 768”): 对于 fRead 中的行: 存储字符串 = 行 读取字符串 = 存储字符串[83:] 读取字符串 = 读取字符串[:76] print readString #验证 分辨率 = 读取字符串[:16] 如果(字符串==“1366 x 768”): 对于 fRead 中的行: 存储字符串 = 行 读取字符串 = 存储字符串[76:] 读取字符串 = 读取字符串[:76] print readString #验证 分辨率 = 读取字符串[:16] 如果(字符串==“1280 x 960”)或(字符串==“1440 x 900”): 对于 fRead 中的行: 存储字符串 = 行 读取字符串 = 存储字符串[84:] 读取字符串 = 读取字符串[:77] print readString #验证 分辨率 = 读取字符串[:16] 如果(字符串==“1440 x 960”): 对于 fRead 中的行: 存储字符串 = 行 读取字符串 = 存储字符串[77:] 读取字符串 = 读取字符串[:76] print readString #验证 分辨率 = 读取字符串[:16] 如果(字符串=="1280 x 1024")或(字符串=="1440 x 1080")或(字符串=="1600 x 1200")或(字符串=="1920 x 1080")或(字符串=="1920 x 1200"): 对于 fRead 中的行: 存储字符串 = 行 读取字符串 = 存储字符串[85:] 读取字符串 = 读取字符串[:81] print readString #验证 分辨率 = 读取字符串[:17] os.system("xrandr --newmode " + readString) fRead.close() def applyBtn_on_clicked(applyBtn): # 检测并存储显示器输出类型 - 例如 VGA1、DVI-0 monitorType = os.popen("xrandr | grep ' 已连接 ' | awk '{ print$1 }'").readlines() fWrite = open('config.sh','w') 打印>>fWrite,monitorType fWrite.关闭() # 从[config.sh]获取输入 fRead = open('config.sh','r') 对于 fRead 中的行: CmonitorType = 线 fRead.close() # 编辑 CmonitorType 以便我们可以使用它 CmonitorType = CmonitorType[2:] CmonitorType = CmonitorType[:7] 打印 CmonitorType#验证 os.system("xrandr --addmode " + CmonitorType + 分辨率) 分辨率X() gtk.main()
我收到此错误:
Traceback (most recent call last): File "file.py", line 129, in applyBtn_on_clicked os.system("xrandr --addmode " + CmonitorType + resolution) NameError: global name 'resolution' is not defined
我怎么解决这个问题?
答案1
对脚本进行以下更改:
在下面的代码行def ResComboB_changed(ResComboB):
中添加以下内容,使其看起来像这样:
def ResComboB_changed(ResComboB):
global resolution
或者resolution = ""
在 def 行上面添加如下内容:
resolution = ""
def ResComboB_changed(ResComboB):
希望有帮助;)